Submission #58041

#TimeUsernameProblemLanguageResultExecution timeMemory
58041E869120Scales (IOI15_scales)C++14
82.14 / 100
778 ms892 KiB
#include "scales.h" #include <iostream> #include <vector> #include <algorithm> #include <tuple> #include <ctime> using namespace std; // ----------------------------- /*int Weight[7], Queries = 0; int getLightest(int A, int B, int C) { cout << "Light " << A << " " << B << " " << C << endl; Queries++; if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [1]" << endl; vector<pair<int, int>>V; for (int i = 1; i <= 6; i++) { if (Weight[i] == A) V.push_back(make_pair(i, A)); if (Weight[i] == B) V.push_back(make_pair(i, B)); if (Weight[i] == C) V.push_back(make_pair(i, C)); } sort(V.begin(), V.end()); return V[0].second; } int getMedian(int A, int B, int C) { cout << "Media " << A << " " << B << " " << C << endl; Queries++; if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [2]" << endl; vector<pair<int, int>>V; for (int i = 1; i <= 6; i++) { if (Weight[i] == A) V.push_back(make_pair(i, A)); if (Weight[i] == B) V.push_back(make_pair(i, B)); if (Weight[i] == C) V.push_back(make_pair(i, C)); } sort(V.begin(), V.end()); return V[1].second; } int getHeaviest(int A, int B, int C) { //cout << "Heavy " << A << " " << B << " " << C << endl; Queries++; if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [3]" << endl; vector<pair<int, int>>V; for (int i = 1; i <= 6; i++) { if (Weight[i] == A) V.push_back(make_pair(i, A)); if (Weight[i] == B) V.push_back(make_pair(i, B)); if (Weight[i] == C) V.push_back(make_pair(i, C)); } sort(V.begin(), V.end()); return V[2].second; } int getNextLightest(int A, int B, int C, int D) { cout << "NextL " << A << " " << B << " " << C << " " << D << endl; Queries++; if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [3]" << endl; vector<pair<int, int>>V; int S = 0; for (int i = 1; i <= 6; i++) { if (Weight[i] == A) V.push_back(make_pair(i, A)); if (Weight[i] == B) V.push_back(make_pair(i, B)); if (Weight[i] == C) V.push_back(make_pair(i, C)); if (Weight[i] == D) S = i; } sort(V.begin(), V.end()); for (int i = 0; i < V.size(); i++) { if (V[i].first > S) return V[i].second; } return V[0].second; } void answer(int W[]) { for (int i = 0; i < 6; i++) { if (W[i] != Weight[i + 1]) { cout << "Wrong Answer [4]" << endl; return; } } cout << "Accepted : Total Number of Queries = " << Queries << endl; }*/ // ----------------------------- // ---------------------------------- 準備用クエリ --------------------------------------- int WWW[7], ret = 0; int _getLightest(int A, int B, int C) { if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [1B]" << endl; vector<pair<int, int>>V; for (int i = 1; i <= 6; i++) { if (WWW[i] == A) V.push_back(make_pair(i, A)); if (WWW[i] == B) V.push_back(make_pair(i, B)); if (WWW[i] == C) V.push_back(make_pair(i, C)); } sort(V.begin(), V.end()); return V[0].second; } int _getMedian(int A, int B, int C) { if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [2B]" << endl; vector<pair<int, int>>V; for (int i = 1; i <= 6; i++) { if (WWW[i] == A) V.push_back(make_pair(i, A)); if (WWW[i] == B) V.push_back(make_pair(i, B)); if (WWW[i] == C) V.push_back(make_pair(i, C)); } sort(V.begin(), V.end()); return V[1].second; } int _getHeaviest(int A, int B, int C) { if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [3B]" << endl; vector<pair<int, int>>V; for (int i = 1; i <= 6; i++) { if (WWW[i] == A) V.push_back(make_pair(i, A)); if (WWW[i] == B) V.push_back(make_pair(i, B)); if (WWW[i] == C) V.push_back(make_pair(i, C)); } sort(V.begin(), V.end()); return V[2].second; } int _getNextLightest(int A, int B, int C, int D) { if (A <= 0 || A >= 7 || B <= 0 || B >= 7 || C <= 0 || C >= 7 || A == B || B == C || C == A) cout << "Wrong Answer [5B]" << endl; vector<pair<int, int>>V; int S = 0; for (int i = 1; i <= 6; i++) { if (WWW[i] == A) V.push_back(make_pair(i, A)); if (WWW[i] == B) V.push_back(make_pair(i, B)); if (WWW[i] == C) V.push_back(make_pair(i, C)); if (WWW[i] == D) S = i; } sort(V.begin(), V.end()); for (int i = 0; i < V.size(); i++) { if (V[i].first > S) return V[i].second; } return V[0].second; } // ---------------------------------- 準備用クエリ終了 ----------------------------------- void init(int T) { } struct State { int a[6]; }; void orderCoins() { srand((unsigned)time(NULL)); vector<State>U; int p[6] = { 1,2,3,4,5,6 }; do { State Y; for (int i = 0; i < 6; i++) Y.a[i] = p[i]; U.push_back(Y); } while (next_permutation(p, p + 6)); vector<pair<int, int>>vec2; vector<int> vec3; int cnt1 = 0; while (U.size() >= 2) { tuple<int, int, int, int>V; int maxn = 1000; for (int i = 1; i <= 6; i++) { for (int j = i + 1; j <= 6; j++) { for (int k = j + 1; k <= 6; k++) { int c1[6] = { 0,0,0,0,0,0 }, c2[6] = { 0,0,0,0,0,0 }, c3[6] = { 0,0,0,0,0,0 }; for (State x : U) { for (int l = 0; l < 6; l++) WWW[l + 1] = x.a[l]; c1[_getLightest(i, j, k) - 1]++; c2[_getMedian(i, j, k) - 1]++; c3[_getHeaviest(i, j, k) - 1]++; } int maxn1 = 0, maxn2 = 0, maxn3 = 0; for (int l = 0; l < 6; l++) maxn1 = max(maxn1, c1[l]); for (int l = 0; l < 6; l++) maxn2 = max(maxn2, c2[l]); for (int l = 0; l < 6; l++) maxn3 = max(maxn3, c3[l]); for (int m = 1; m <= 6; m++) { if (i == m || j == m || k == m) continue; int c4[6] = { 0,0,0,0,0,0 }; for (State x : U) { for (int l = 0; l < 6; l++) WWW[l + 1] = x.a[l]; c4[_getNextLightest(i, j, k, m) - 1]++; } int maxn4 = 0; for (int l = 0; l < 6; l++) maxn4 = max(maxn4, c4[l]); if (maxn4 < maxn || (maxn4 == maxn && rand() % 10 == 0)) { maxn = maxn4; V = make_tuple(i, j, k, m); } } if (maxn3 < maxn || (maxn3 == maxn && rand() % 10 == 0)) { maxn = maxn3; V = make_tuple(-3, i, j, k); } if (maxn1 < maxn || (maxn1 == maxn && rand() % 10 <= 2)) { maxn = maxn1; V = make_tuple(-1, i, j, k); } if (maxn2 < maxn || (maxn2 == maxn && rand() % 10 <= 3)) { maxn = maxn2; V = make_tuple(-2, i, j, k); } } } } if (cnt1 == 0) { V = make_tuple(-1, 1, 2, 3); } if (cnt1 == 1) { V = make_tuple(-2, 4, 5, 6); } if (cnt1 == 2) { vector<int>vec4; for (int i = 1; i <= 6; i++) { if (i != vec3[0] && i != vec3[1])vec4.push_back(i); } V = make_tuple(vec4[0], vec4[1], vec4[2], vec3[1]); //cout << vec3[0] << " " << vec3[1] << endl; } if (get<0>(V) == -1) { int Z = getLightest(get<1>(V), get<2>(V), get<3>(V)); if (cnt1 <= 1) vec3.push_back(Z); vector<State>US; for (State x : U) { for (int i = 0; i < 6; i++) WWW[i + 1] = x.a[i]; int F = _getLightest(get<1>(V), get<2>(V), get<3>(V)); if (F == Z) US.push_back(x); } U = US; } if (get<0>(V) == -2) { int Z = getMedian(get<1>(V), get<2>(V), get<3>(V)); if (cnt1 <= 1) vec3.push_back(Z); vector<State>US; for (State x : U) { for (int i = 0; i < 6; i++) WWW[i + 1] = x.a[i]; int F = _getMedian(get<1>(V), get<2>(V), get<3>(V)); if (F == Z) US.push_back(x); } U = US; } if (get<0>(V) == -3) { int Z = getHeaviest(get<1>(V), get<2>(V), get<3>(V)); vector<State>US; for (State x : U) { for (int i = 0; i < 6; i++) WWW[i + 1] = x.a[i]; int F = _getHeaviest(get<1>(V), get<2>(V), get<3>(V)); if (F == Z) US.push_back(x); } U = US; } if (get<0>(V) >= 1) { int Z = getNextLightest(get<0>(V), get<1>(V), get<2>(V), get<3>(V)); vector<State>US; for (State x : U) { for (int i = 0; i < 6; i++) WWW[i + 1] = x.a[i]; int F = _getNextLightest(get<0>(V), get<1>(V), get<2>(V), get<3>(V)); if (F == Z) US.push_back(x); } U = US; } vec2.push_back(make_pair(U.size(), maxn)); cnt1++; } if (cnt1 >= 7) { ret++; } //for (int i = 0; i < vec2.size(); i++) cout << "->" << vec2[i].first << " " << vec2[i].second << endl; int WW[6]; for (int i = 0; i < 6; i++) WW[i] = U[0].a[i]; answer(WW); }

Compilation message (stderr)

In file included from grader.c:2:0:
graderlib.c: In function 'void answer(int*)':
graderlib.c:53:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
     if (_ghksjhdfkae19ga_ > 1) 
     ^~
graderlib.c:56:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  for (i = 0; i < 6; i++) {
  ^~~
scales.cpp: In function 'int _getNextLightest(int, int, int, int)':
scales.cpp:125:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < V.size(); i++) {
                  ~~^~~~~~~~~~
scales.cpp: In function 'void init(int)':
scales.cpp:133:15: warning: unused parameter 'T' [-Wunused-parameter]
 void init(int T) {
               ^
#Verdict Execution timeMemoryGrader output
Fetching results...