Submission #1159501

#TimeUsernameProblemLanguageResultExecution timeMemory
1159501SebScales (IOI15_scales)C++17
0 / 100
1095 ms320 KiB
#include "scales.h" #include <bits/stdc++.h> using namespace std; struct query{ int id, a, b, c, d; query(int id, int a, int b, int c, int d): id(id), a(a), b(b), c(c), d(d) {} query(): id(0), a(0), b(0), c(0), d(0) {} }; vector<array<int, 6>> posi, posi_save; array<int, 6> aux; int vis[7]; vector<query> ans; void genera(int idx = 0) { if (idx == 6) { posi_save.push_back(aux); return; } for (int i = 1; i <= 6; i++) if (!vis[i]) { aux[idx] = i; vis[i] = 1; genera(idx + 1); vis[i] = 0; } } void init(int T) { for (int i = 1; i <= 6; i++) for (int j = i + 1; j <= 6; j++) for (int k = j + 1; k <= 6; k++) { ans.push_back(query(0, i, j, k, 0)); ans.push_back(query(1, i, j, k, 0)); ans.push_back(query(2, i, j, k, 0)); for (int x = 1; x <= 6; x++) { if (x == i || x == j || x == k) continue; ans.push_back(query(3, i, j, k, x)); } } genera(); } int Heaviest(array<int, 6> C, query A) { for (int i = 5; i >= 0; i--) if (C[i] == A.a || C[i] == A.b || C[i] == A.c) return C[i]; } int Median(array<int, 6> C, query A) { bool flag = false; for (int i = 0; i < 6; i++) { if (flag) { if (C[i] == A.a || C[i] == A.b || C[i] == A.c) return C[i]; } else if (C[i] == A.a || C[i] == A.b || C[i] == A.c) flag = true; } } int Lightest(array<int, 6> C, query A) { for (int i = 0; i < 6; i++) if (C[i] == A.a || C[i] == A.b || C[i] == A.c) return C[i]; } int NextLightest(array<int, 6> C, query A) { bool flag = false; for (int i = 0; i < 12; i++) { if (flag) { if (C[i%6] == A.a || C[i%6] == A.b || C[i%6] == A.c) return C[i%6]; } else if (C[i] == A.d) flag = true; } } int calc(query A) { int caso_resp, ansA = 0, ansB = 0, ansC = 0; for (int i = 0; i < posi.size(); i++) { if (A.id == 0) caso_resp = Heaviest(posi[i], A); else if (A.id == 1) caso_resp = Median(posi[i], A); else if (A.id == 2) caso_resp = Lightest(posi[i], A); else caso_resp = NextLightest(posi[i], A); if (caso_resp != ansA) ansA++; if (caso_resp != ansB) ansB++; if (caso_resp != ansC) ansC++; } return min({ansA, ansB, ansC}); } void ask(query A) { int resp, caso_resp; for (int i = 0; i < posi.size(); i++) { if (A.id == 0) { caso_resp = Heaviest(posi[i], A); resp = getHeaviest(A.a, A.b, A.c); } else if (A.id == 1) { caso_resp = Median(posi[i], A); resp = getMedian(A.a, A.b, A.c); } else if (A.id == 2) { caso_resp = Lightest(posi[i], A); resp = getLightest(A.a, A.b, A.c); } else { caso_resp = NextLightest(posi[i], A); resp = getNextLightest(A.a, A.b, A.c, A.d); } if (caso_resp != resp) { swap(posi[i], posi[posi.size() - 1]); posi.pop_back(); i--; continue; } } } void orderCoins() { posi = posi_save; while (posi.size() > 1) { query A = query(); int cnt = 0, cnt_aux; for (int i = 0; i < ans.size(); i++) { cnt_aux = calc(ans[i]); if (cnt <= cnt_aux) { A = ans[i]; cnt = cnt_aux; } } ask(A); } // respuesta int arr[6]; for (int i = 0; i < 6; i++) arr[i] = posi[0][i]; answer(arr); posi.clear(); }

Compilation message (stderr)

scales.cpp: In function 'int Heaviest(std::array<int, 6>, query)':
scales.cpp:54:1: warning: control reaches end of non-void function [-Wreturn-type]
   54 | }
      | ^
scales.cpp: In function 'int Median(std::array<int, 6>, query)':
scales.cpp:65:1: warning: control reaches end of non-void function [-Wreturn-type]
   65 | }
      | ^
scales.cpp: In function 'int Lightest(std::array<int, 6>, query)':
scales.cpp:70:1: warning: control reaches end of non-void function [-Wreturn-type]
   70 | }
      | ^
scales.cpp: In function 'int NextLightest(std::array<int, 6>, query)':
scales.cpp:81:1: warning: control reaches end of non-void function [-Wreturn-type]
   81 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...