#include <algorithm> #include <iostream> #include <cstdlib> #include "cielib.h" using namespace std; const int N = 600; int K[N]; int T[N]; int A1[N],A2[N]; int l; bool Blizej(int wsp,int x,int x1){ T[wsp] = x1; czyCieplo(T); T[wsp] = x; l += 2; return czyCieplo(T); } int WyszukajOdGory(int p,int k,int i){ int s; while(p<k){ s = (p+k+1)/2; if( Blizej(i,s-1,s) ) k = s-1; else p = s; } return p; } int WyszukajOdDolu(int p,int k,int i){ int s; while(p<k){ s = (p+k)/2; if( Blizej(i,s+1,s) ) p = s+1; else k = s; } return p; } void UstawTakieSameD(int d,int r){ int i,wsp; for(i=0; i<d; i++) T[i] = r/2; for(i=0; i<d; i++){ if( Blizej(i,r-1,r) ) { wsp = WyszukajOdGory(1,r,i); K[i] = 1; } else wsp = WyszukajOdDolu(0,r-1,i); T[i] = wsp; } } bool BlizejTab(int d,int d1,int d2){ int i; for(i=0; i<d; i++){ if(K[i] == 0) A1[i] = T[i]+d1; else A1[i] = T[i]-d1; } for(i=0; i<d; i++){ if(K[i] == 0) A2[i] = T[i]+d2; else A2[i] = T[i]-d2; } czyCieplo(A2); return czyCieplo(A1); } int Wyszukaj(int p,int k,int d){ int s; while(p < k){ s = (p+k+1)/2; //cout << s << " "; if( BlizejTab(d,s-1,s) ) k = s-1; else p = s; } //cout << "\n"; return p; } int main(){ int d = podajD(); int k = podajK(); int r = podajR(); int i,dis; UstawTakieSameD(d,r); //cout << l << "\n"; dis = Wyszukaj(0,(r+1)/2,d); for(i=0; i<d; i++){ if(K[i] == 0) T[i] += dis; else T[i] -= dis; } znalazlem(T); 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <algorithm> #include <iostream> #include <cstdlib> #include "cielib.h" using namespace std; const int N = 600; int K[N]; int T[N]; int A1[N],A2[N]; int l; bool Blizej(int wsp,int x,int x1){ T[wsp] = x1; czyCieplo(T); T[wsp] = x; l += 2; return czyCieplo(T); } int WyszukajOdGory(int p,int k,int i){ int s; while(p<k){ s = (p+k+1)/2; if( Blizej(i,s-1,s) ) k = s-1; else p = s; } return p; } int WyszukajOdDolu(int p,int k,int i){ int s; while(p<k){ s = (p+k)/2; if( Blizej(i,s+1,s) ) p = s+1; else k = s; } return p; } void UstawTakieSameD(int d,int r){ int i,wsp; for(i=0; i<d; i++) T[i] = r/2; for(i=0; i<d; i++){ if( Blizej(i,r-1,r) ) { wsp = WyszukajOdGory(1,r,i); K[i] = 1; } else wsp = WyszukajOdDolu(0,r-1,i); T[i] = wsp; } } bool BlizejTab(int d,int d1,int d2){ int i; for(i=0; i<d; i++){ if(K[i] == 0) A1[i] = T[i]+d1; else A1[i] = T[i]-d1; } for(i=0; i<d; i++){ if(K[i] == 0) A2[i] = T[i]+d2; else A2[i] = T[i]-d2; } czyCieplo(A2); return czyCieplo(A1); } int Wyszukaj(int p,int k,int d){ int s; while(p < k){ s = (p+k+1)/2; //cout << s << " "; if( BlizejTab(d,s-1,s) ) k = s-1; else p = s; } //cout << "\n"; return p; } int main(){ int d = podajD(); int k = podajK(); int r = podajR(); int i,dis; UstawTakieSameD(d,r); //cout << l << "\n"; dis = Wyszukaj(0,(r+1)/2,d); for(i=0; i<d; i++){ if(K[i] == 0) T[i] += dis; else T[i] -= dis; } znalazlem(T); return 0; } |