#include <bits/stdc++.h>
using namespace std;
#include "cielib.h"
#define pb push_back
#define MAXD 501
int D,K,R;
int P[MAXD];
int POM[MAXD];
int przedzial[MAXD];
bool pivot[MAXD];
void wczytaj()
{
D = podajD();
R = podajR();
for(int i = 0;i < D;++i) przedzial[i] = R;
}
bool G()
{
czyCieplo(P);
for(int i = 0;i < D;++i)
{
POM[i] = P[i];
if(!pivot[i])
POM[i]++;
}
return czyCieplo(POM);
}
vector <int> pom;
void znajdz_maksy()
{
pom.clear();
for(int i = 0;i < D;++i)
{
POM[i] = P[i];
if(!pivot[i])
POM[i]++;
}
for(int i = 0;i < D;++i)
{
bool g = false;
if(!pivot[i])
{
POM[i]--;
if(czyCieplo(POM)) g = true;
else POM[i]++,pom.pb(i);
}
if(g) czyCieplo(P);
}
}
void akt()
{
int mini = 1e9 + 1;
for(int i = 0;i < (int)pom.size();++i)
{
mini = min(mini,przedzial[pom[i]]);
}
for(int i = 0;i < (int)pom.size();++i)
{
P[pom[i]] += mini;
}
int sr = mini / 2;
int pocz = 0;
if(czyCieplo(P))
pocz = sr + 1,
sr = mini - pocz;
for(int i = 0;i < (int)pom.size();++i)
P[pom[i]] -= mini,
P[pom[i]] += pocz,
przedzial[pom[i]] = sr;
if(!sr)
for(int i = 0;i < (int)pom.size();++i)
pivot[pom[i]] = true;
}
void przedzialy_dwojkowe()
{
while(G())
{
czyCieplo(P);
znajdz_maksy();
akt();
}
}
void dokoncz()
{
for(int i = 0;i < D;++i)
{
if(pivot[i]) continue;
P[i] += 2;
czyCieplo(P);
P[i] -= 2;
if(!czyCieplo(P))
P[i]++;
}
}
int main()
{
wczytaj();
przedzialy_dwojkowe();
dokoncz();
znalazlem(P);
}
/*
10 200 100
1 2 3 4 5 6 7 8 9 10
*/
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include <bits/stdc++.h> using namespace std; #include "cielib.h" #define pb push_back #define MAXD 501 int D,K,R; int P[MAXD]; int POM[MAXD]; int przedzial[MAXD]; bool pivot[MAXD]; void wczytaj() { D = podajD(); R = podajR(); for(int i = 0;i < D;++i) przedzial[i] = R; } bool G() { czyCieplo(P); for(int i = 0;i < D;++i) { POM[i] = P[i]; if(!pivot[i]) POM[i]++; } return czyCieplo(POM); } vector <int> pom; void znajdz_maksy() { pom.clear(); for(int i = 0;i < D;++i) { POM[i] = P[i]; if(!pivot[i]) POM[i]++; } for(int i = 0;i < D;++i) { bool g = false; if(!pivot[i]) { POM[i]--; if(czyCieplo(POM)) g = true; else POM[i]++,pom.pb(i); } if(g) czyCieplo(P); } } void akt() { int mini = 1e9 + 1; for(int i = 0;i < (int)pom.size();++i) { mini = min(mini,przedzial[pom[i]]); } for(int i = 0;i < (int)pom.size();++i) { P[pom[i]] += mini; } int sr = mini / 2; int pocz = 0; if(czyCieplo(P)) pocz = sr + 1, sr = mini - pocz; for(int i = 0;i < (int)pom.size();++i) P[pom[i]] -= mini, P[pom[i]] += pocz, przedzial[pom[i]] = sr; if(!sr) for(int i = 0;i < (int)pom.size();++i) pivot[pom[i]] = true; } void przedzialy_dwojkowe() { while(G()) { czyCieplo(P); znajdz_maksy(); akt(); } } void dokoncz() { for(int i = 0;i < D;++i) { if(pivot[i]) continue; P[i] += 2; czyCieplo(P); P[i] -= 2; if(!czyCieplo(P)) P[i]++; } } int main() { wczytaj(); przedzialy_dwojkowe(); dokoncz(); znalazlem(P); } /* 10 200 100 1 2 3 4 5 6 7 8 9 10 */ |
English