#include"cielib.h" #include<stdio.h> #include<set> #include<vector> using namespace std; int d,k,r; int begins[501],ends[501],newBegin[501],newEnd[501]; int tmp[501]; struct cmp { bool operator()(const int & a, const int & b) const { int diffA = ends[a]- begins[a]; int diffB= ends[b]- begins[b]; return diffA>diffB||(diffA==diffB && a<b); } }; set<int,cmp> s; int check(int wymiar) { int prev = tmp[wymiar]; tmp[wymiar] = begins[wymiar]; bool czyBegin = czyCieplo(tmp); tmp[wymiar]=ends[wymiar]; bool czyEnd = czyCieplo(tmp); bool blizejEnd = czyEnd; tmp[wymiar] = begins[wymiar]; bool blizejBegin = czyCieplo(tmp); if(blizejEnd) { newBegin[wymiar] = (begins[wymiar]+ends[wymiar])/2+1; newEnd[wymiar]= ends[wymiar]; }else if(blizejBegin) { newBegin[wymiar] = begins[wymiar]; newEnd[wymiar] = (begins[wymiar]+ends[wymiar]-1)/2; } else { if((begins[wymiar] +ends[wymiar])%2==0) { newBegin[wymiar]= newEnd[wymiar] = (begins[wymiar]+ ends[wymiar])/2; } else { newBegin[wymiar] = (begins[wymiar]+ ends[wymiar])/2; newEnd[wymiar] = (begins[wymiar]+ ends[wymiar]+1)/2; if(newEnd[wymiar] == newBegin[wymiar]+1) newEnd[wymiar]++; } } begins[wymiar]=newBegin[wymiar]; ends[wymiar]=newEnd[wymiar]; tmp[wymiar] = (begins[wymiar]+ ends[wymiar])/2; } int main() { d= podajD();k = podajK();r=podajR(); int pot=1,ile=1; for (int j=0;;j++) { ile++; pot*=2; if(r< pot) break; } for (int i =0;i<d;i++) { begins[i]=0; ends[i]=r; tmp[i]= r/2; s.insert(i); } while(!s.empty()) { int u = *s.begin(); s.erase(s.find(u)); check(u); if(begins[u]!=ends[u]) s.insert(u); } znalazlem(begins); 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 | #include"cielib.h" #include<stdio.h> #include<set> #include<vector> using namespace std; int d,k,r; int begins[501],ends[501],newBegin[501],newEnd[501]; int tmp[501]; struct cmp { bool operator()(const int & a, const int & b) const { int diffA = ends[a]- begins[a]; int diffB= ends[b]- begins[b]; return diffA>diffB||(diffA==diffB && a<b); } }; set<int,cmp> s; int check(int wymiar) { int prev = tmp[wymiar]; tmp[wymiar] = begins[wymiar]; bool czyBegin = czyCieplo(tmp); tmp[wymiar]=ends[wymiar]; bool czyEnd = czyCieplo(tmp); bool blizejEnd = czyEnd; tmp[wymiar] = begins[wymiar]; bool blizejBegin = czyCieplo(tmp); if(blizejEnd) { newBegin[wymiar] = (begins[wymiar]+ends[wymiar])/2+1; newEnd[wymiar]= ends[wymiar]; }else if(blizejBegin) { newBegin[wymiar] = begins[wymiar]; newEnd[wymiar] = (begins[wymiar]+ends[wymiar]-1)/2; } else { if((begins[wymiar] +ends[wymiar])%2==0) { newBegin[wymiar]= newEnd[wymiar] = (begins[wymiar]+ ends[wymiar])/2; } else { newBegin[wymiar] = (begins[wymiar]+ ends[wymiar])/2; newEnd[wymiar] = (begins[wymiar]+ ends[wymiar]+1)/2; if(newEnd[wymiar] == newBegin[wymiar]+1) newEnd[wymiar]++; } } begins[wymiar]=newBegin[wymiar]; ends[wymiar]=newEnd[wymiar]; tmp[wymiar] = (begins[wymiar]+ ends[wymiar])/2; } int main() { d= podajD();k = podajK();r=podajR(); int pot=1,ile=1; for (int j=0;;j++) { ile++; pot*=2; if(r< pot) break; } for (int i =0;i<d;i++) { begins[i]=0; ends[i]=r; tmp[i]= r/2; s.insert(i); } while(!s.empty()) { int u = *s.begin(); s.erase(s.find(u)); check(u); if(begins[u]!=ends[u]) s.insert(u); } znalazlem(begins); return 0; } |