#include <stdio.h> #include <algorithm> #define SIZE 2001005 #define DEBUG if(0) std::pair <int, short int> wina[SIZE]; int n; void calcPrawo(int pos, int row) { DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row].first + 1); wina[pos].first = wina[pos-row].first + 1; if(pos+row+1 <= (n*(n+1))/2) calcPrawo(pos+row+1,row+1); } void calc(int pos, int add, int row, bool dir) { if(!dir) { DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row+1].first + add); wina[pos].first = wina[pos-row+1].first + add; } else { DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row].first + add); wina[pos].first = wina[pos-row].first + add; } if(pos+row <= (n*(n+1))/2 && add == 1 && !wina[pos+row].first) calc(pos+row,add,row+1, 0); if(pos == 1) { calcPrawo(1,1); return; } if(pos+row+1 <= (n*(n+1))/2) calc(pos+row+1,(add == 1 ? wina[pos].first : add),row+1, 1); } int main(void) { int k; scanf("%d %d",&n,&k); for(int i=1; i<=((n*(n+1))/2); i++) scanf("%hd",&wina[i].second); calc(1,1,1,0); short int min=wina[1].second; for(int i=1; i<=((n*(n+1))/2); i++) if(wina[i].first <= k) min = std::min(min,wina[i].second); printf("%hd",min); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <stdio.h> #include <algorithm> #define SIZE 2001005 #define DEBUG if(0) std::pair <int, short int> wina[SIZE]; int n; void calcPrawo(int pos, int row) { DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row].first + 1); wina[pos].first = wina[pos-row].first + 1; if(pos+row+1 <= (n*(n+1))/2) calcPrawo(pos+row+1,row+1); } void calc(int pos, int add, int row, bool dir) { if(!dir) { DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row+1].first + add); wina[pos].first = wina[pos-row+1].first + add; } else { DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row].first + add); wina[pos].first = wina[pos-row].first + add; } if(pos+row <= (n*(n+1))/2 && add == 1 && !wina[pos+row].first) calc(pos+row,add,row+1, 0); if(pos == 1) { calcPrawo(1,1); return; } if(pos+row+1 <= (n*(n+1))/2) calc(pos+row+1,(add == 1 ? wina[pos].first : add),row+1, 1); } int main(void) { int k; scanf("%d %d",&n,&k); for(int i=1; i<=((n*(n+1))/2); i++) scanf("%hd",&wina[i].second); calc(1,1,1,0); short int min=wina[1].second; for(int i=1; i<=((n*(n+1))/2); i++) if(wina[i].first <= k) min = std::min(min,wina[i].second); printf("%hd",min); return 0; } |