#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; } |
English