제출 #895628

#제출 시각아이디문제언어결과실행 시간메모리
895628Tenis0206코알라 (APIO17_koala)C++11
55 / 100
33 ms600 KiB
#include <bits/stdc++.h> #include "koala.h" using namespace std; const int nmax = 100; int n; int b[nmax + 5], r[nmax + 5]; int paux[nmax + 5]; bool sel[nmax + 5]; int find_value(int poz, int W) { int st = 1; int dr = n; int rez = 0; while(st<=dr) { int mij = (st + dr) >> 1; for(int i=0; i<n; i++) { r[i] = 0, b[i] = 0; } if(W == 200) { for(int i=0; i<n; i++) { b[i] = 1; } } for(int i=0; i<mij; i++) { ++b[i]; } playRound(b,r); if(r[poz] <= b[poz]) { dr = mij - 1; rez = mij; } else { st = mij + 1; } } return rez; } /*int comp(int pa, int pb) { int st = 1; int dr = n - 2; int rez = 0; while(st<=dr) { int mij = (st + dr) >> 1; for(int i=0;i<n;i++) { r[i] = 0, b[i] = 0; } if(W == 200) { for(int i=0;i<n;i++) { b[i] = 1; } } int nr = 0; for(int i=0;i<n && nr < mij;i++) { if(i == pa || i == pb) { continue; } ++b[i]; ++nr; } playRound(b,r); if(r[pa] <= b[pa] && r[pb] > b[pb]) { return pb; } if(r[pb] <= ) if(r[poz] <= b[poz]) { dr = mij - 1; rez = mij; } else { st = mij + 1; } } return rez; } */ int minValue(int N, int W) { n = N; for(int i=0; i<n; i++) { b[i] = 0; r[i] = 0; } b[0] = 1; playRound(b,r); for(int i=0; i<n; i++) { if(r[i] <= b[i]) { return i; } } return 0; } int maxValue(int N, int W) { n = N; vector<int> c; for(int i=0; i<n; i++) { c.push_back(i); } int nr = 0; while(true) { ++nr; while((nr + 1) * (int)(c.size()) <= W) { ++nr; } for(int i=0; i<n; i++) { b[i] = 0, r[i] = 0; } for(auto it : c) { b[it] = nr; } playRound(b,r); vector<int> aux; for(auto it : c) { if(r[it] > b[it]) { aux.push_back(it); } } c = aux; if(c.size() == 1) { return c.front(); } } return 0; } int greaterValue(int N, int W) { return 0; //return comp(0,1,W); } void allValues(int N, int W, int *P) { n = N; #ifdef home ifstream f("nr.in"); int a,bb,c,d; f>>a>>bb>>c>>d; for(int i=0; i<n; i++) { f>>paux[i]; } #endif // home if (W == 2*N) { for(int val=1; val<=n; val++) { int poz = 0; for(int i=0; i<n; i++) { if(paux[i] == val) { poz = i; break; } } int st = 1; int dr = 200; int rez = 0; while(st<=dr) { int mij = (st + dr) >> 1; for(int i=0; i<n; i++) { b[i] = r[i] = 1; } b[poz] = mij; playRound(b,r); if(r[poz] > b[poz]) { rez = mij; st = mij + 1; } else { dr = mij - 1; } } cout<<rez<<'\n'; } } else { for(int i=0; i<n; i++) { sel[i] = false; } for(int val=n; val>=2; val--) { vector<int> c; for(int i=0; i<n; i++) { if(sel[i]) { continue; } c.push_back(i); } int poz = 0; int nr = 0; while(true) { ++nr; if(val > 54) { while((nr + 1) * (int)(c.size()) + (n - val) <= W) { ++nr; } } for(int i=0; i<n; i++) { b[i] = 0, r[i] = 0; } for(auto it : c) { b[it] = nr; } playRound(b,r); vector<int> aux; for(auto it : c) { if(r[it] > b[it]) { aux.push_back(it); } } c = aux; if(c.size() == 1) { poz = c.front(); break; } } P[poz] = val; sel[poz] = true; } for(int i=0; i<n; i++) { if(!sel[i]) { P[i] = 1; } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...