제출 #944532

#제출 시각아이디문제언어결과실행 시간메모리
944532Lobo저울 (IOI15_scales)C++17
71.43 / 100
467 ms804 KiB
#include "scales.h" #include<bits/stdc++.h> using namespace std; #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() const int maxn = -1; vector<vector<int>> allp, queries; void init(int T) { vector<int> p = {0,1,2,3,4,5,6}; while(p[0] == 0) { allp.pb(p); next_permutation(all(p)); } for(int a = 1; a <= 6; a++) { for(int b = a+1; b <= 6; b++) { for(int c = b+1; c <= 6; c++) { queries.pb(vector<int>{0,a,b,c}); queries.pb(vector<int>{1,a,b,c}); queries.pb(vector<int>{2,a,b,c}); for(int d = 1; d <= 6; d++) { if(d == a or d == b or d == c) continue; queries.pb(vector<int>{3,a,b,c,d}); } } } } /* ... */ } // 0 L // 1 M // 2 H // 3 S // ABC(3->D) // resp vector<vector<int>> postot(vector<vector<int>> &disp, vector<vector<int>> qrs) { vector<vector<int>> ansp; for(auto p : disp) { bool ok = true; for(auto vec : qrs) { int tp = vec[0]; int res = vec.back(); if(tp == 0) { int a = vec[1]; int b = vec[2]; int c = vec[3]; if(min({p[a],p[b],p[c]}) != p[res]) { ok = false; break; } } else if(tp == 1) { int a = vec[1]; int b = vec[2]; int c = vec[3]; if(p[a]+p[b]+p[c] - min({p[a],p[b],p[c]}) - max({p[a],p[b],p[c]}) != p[res]) { ok = false; break; } } else if(tp == 2) { int a = vec[1]; int b = vec[2]; int c = vec[3]; if(max({p[a],p[b],p[c]}) != p[res]) { ok = false; break; } } else if(tp == 3) { int a = vec[1]; int b = vec[2]; int c = vec[3]; int d = vec[4]; if(p[d] > max({p[a],p[b],p[c]})) { if(p[res] != min({p[a],p[b],p[c]})) { ok = false; break; } } else { int anshere = 7; if(p[a] > p[d]) anshere = min(anshere,p[a]); if(p[b] > p[d]) anshere = min(anshere,p[b]); if(p[c] > p[d]) anshere = min(anshere,p[c]); if(anshere != p[res]) { ok = false; break; } } } } if(ok) { ansp.pb(p); } } return ansp; } void orderCoins() { vector<vector<int>> qrsofar; vector<vector<int>> perms = allp; while(true) { pair<int,vector<int>> mnqr; mnqr.fr = 800; for(auto qr : queries) { qrsofar.pb(qr); qrsofar.back().pb(0); int mx = 0; qrsofar.back().back() = qr[1]; mx = max(mx,(int) postot(perms,qrsofar).size()); qrsofar.back().back() = qr[2]; mx = max(mx,(int) postot(perms,qrsofar).size()); qrsofar.back().back() = qr[3]; mx = max(mx,(int) postot(perms,qrsofar).size()); qrsofar.pop_back(); mnqr = min(mnqr,mp(mx,qr)); } // cout << " " << mnqr.fr << endl; auto qr = mnqr.sc; if(qr[0] == 0) { qr.pb(getLightest(qr[1],qr[2],qr[3])); } if(qr[0] == 1) { qr.pb(getMedian(qr[1],qr[2],qr[3])); } if(qr[0] == 2) { qr.pb(getHeaviest(qr[1],qr[2],qr[3])); } if(qr[0] == 3) { qr.pb(getNextLightest(qr[1],qr[2],qr[3],qr[4])); } // for(auto x : qr) cout << x << endl; // cout << endl; // cout << mnqr.fr << endl; qrsofar.pb(qr); // cout << " " << postot(perms,qrsofar).size() << endl; // auto p = postot(perms,qrsofar)[0]; // for(int i = 1; i <= 6; i++) cout << p[i] << " "; cout << endl; // p = postot(perms,qrsofar)[1]; // for(int i = 1; i <= 6; i++) cout << p[i] << " "; cout << endl; // break; perms = postot(perms,qrsofar); if(perms.size() == 1) break; } auto p = postot(perms,qrsofar)[0]; vector<int> pos(7); for(int i = 1; i <= 6; i++) pos[p[i]] = i; auto ansvec = pos; int ANS[] = {ansvec[1],ansvec[2],ansvec[3],ansvec[4],ansvec[5],ansvec[6]}; answer(ANS); // /* ... */ // int W[] = {1, 2, 3, 4, 5, 6}; // answer(W); }

컴파일 시 표준 에러 (stderr) 메시지

scales.cpp: In function 'void init(int)':
scales.cpp:12:15: warning: unused parameter 'T' [-Wunused-parameter]
   12 | void init(int T) {
      |           ~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...