#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 */ |