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