Submission #286480

#TimeUsernameProblemLanguageResultExecution timeMemory
286480AaronNaiduScales (IOI15_scales)C++14
71.43 / 100
54 ms512 KiB
#include <bits/stdc++.h> #include "scales.h" using namespace std; int t; vector<vector<int> > possiblePerms; bool used[7]; void init(int T) { t = T; } int vectorFind(vector<int> v, int a) { for (int i = 0; i < v.size(); i++) { if (v[i] == a) { return i; } } return -1; } void generatePerms(vector<int> v) { if (v.size() == 6) { possiblePerms.push_back(v); return; } for (int i = 1; i <= 6; i++) { if (!used[i]) { used[i] = true; v.push_back(i); generatePerms(v); v.pop_back(); used[i] = false; } } } int checkMin(int a, int b, int c) { int aCount = 0; int bCount = 0; int cCount = 0; for (auto i : possiblePerms) { if (vectorFind(i, a) < vectorFind(i, b) and vectorFind(i, a) < vectorFind(i, c)) { aCount++; } else if (vectorFind(i, b) < vectorFind(i,c)) { bCount++; } else { cCount++; } } return max(aCount, max(bCount, cCount)); } int checkMax(int a, int b, int c) { int aCount = 0; int bCount = 0; int cCount = 0; for (auto i : possiblePerms) { if (vectorFind(i, a) > vectorFind(i, b) and vectorFind(i, a) > vectorFind(i, c)) { aCount++; } else if (vectorFind(i, b) > vectorFind(i,c)) { bCount++; } else { cCount++; } } return max(aCount, max(bCount, cCount)); } int checkMed(int a, int b, int c) { int aCount = 0; int bCount = 0; int cCount = 0; for (auto i : possiblePerms) { if (vectorFind(i, b) < vectorFind(i, a) and vectorFind(i, a) < vectorFind(i, c)) { aCount++; } else if (vectorFind(i, c) < vectorFind(i,a) and vectorFind(i, a) < vectorFind(i, b)) { aCount++; } else if (vectorFind(i, c) < vectorFind(i,b) and vectorFind(i, b) < vectorFind(i, a)) { bCount++; } else if (vectorFind(i, a) < vectorFind(i,b) and vectorFind(i, b) < vectorFind(i, c)) { bCount++; } else { cCount++; } } return max(aCount, max(bCount, cCount)); } int checkOther(int a, int b, int c, int d) { return 1000000009; } void optimalQuestion() { int minAnswer = 1000000000; int minType = -1; int mina, minb, minc, mind; for (int i = 1; i <= 6; i++) { for (int j = i+1; j <= 6; j++) { for (int k = j+1; k <= 6; k++) { int small = checkMin(i, j, k); int large = checkMax(i, j, k); int med = checkMed(i, j, k); if (small < minAnswer) { minAnswer = small; mina = i; minb = j; minc = k; minType = 1; } if (large < minAnswer) { minAnswer = large; mina = i; minb = j; minc = k; minType = 3; } if (med < minAnswer) { minAnswer = med; mina = i; minb = j; minc = k; minType = 2; } for (int l = k+1; l <= 6; l++) { int ans; ans = checkOther(i, j, k, l); if (ans < minAnswer) { minAnswer = ans; mina = i; minb = j; minc = k; mind = l; minType = 4; } ans = checkOther(i, j, l, k); if (ans < minAnswer) { minAnswer = ans; mina = i; minb = j; minc = l; mind = k; minType = 4; } ans = checkOther(i, k, l, j); if (ans < minAnswer) { minAnswer = ans; mina = i; minb = k; minc = l; mind = j; minType = 4; } ans = checkOther(j, k, l, i); if (ans < minAnswer) { minAnswer = ans; mina = j; minb = k; minc = l; mind = i; minType = 4; } } } } } //cout << possiblePerms.size() << " possiblities\n"; if (minType == 1) { int x = getLightest(mina, minb, minc); vector<vector<int> > newPossiblePerms; for (auto i : possiblePerms) { if (vectorFind(i, x) > vectorFind(i, mina)) { continue; } if (vectorFind(i, x) > vectorFind(i, minb)) { continue; } if (vectorFind(i, x) > vectorFind(i, minc)) { continue; } newPossiblePerms.push_back(i); } possiblePerms = newPossiblePerms; newPossiblePerms.clear(); } if (minType == 3) { int x = getHeaviest(mina, minb, minc); vector<vector<int> > newPossiblePerms; for (auto i : possiblePerms) { if (vectorFind(i, x) < vectorFind(i, mina)) { continue; } if (vectorFind(i, x) < vectorFind(i, minb)) { continue; } if (vectorFind(i, x) < vectorFind(i, minc)) { continue; } newPossiblePerms.push_back(i); } possiblePerms = newPossiblePerms; newPossiblePerms.clear(); } if (minType == 2) { int x = getMedian(mina, minb, minc); vector<vector<int> > newPossiblePerms; for (auto i : possiblePerms) { if (vectorFind(i, minb) > vectorFind(i, x) and vectorFind(i, x) > vectorFind(i, mina)) { newPossiblePerms.push_back(i); } if (vectorFind(i, mina) > vectorFind(i, x) and vectorFind(i, x) > vectorFind(i, minb)) { newPossiblePerms.push_back(i); } if (vectorFind(i, minb) > vectorFind(i, x) and vectorFind(i, x) > vectorFind(i, minc)) { newPossiblePerms.push_back(i); } if (vectorFind(i, minc) > vectorFind(i, x) and vectorFind(i, x) > vectorFind(i, minb)) { newPossiblePerms.push_back(i); } if (vectorFind(i, mina) > vectorFind(i, x) and vectorFind(i, x) > vectorFind(i, minc)) { newPossiblePerms.push_back(i); } if (vectorFind(i, minc) > vectorFind(i, x) and vectorFind(i, x) > vectorFind(i, mina)) { newPossiblePerms.push_back(i); } } possiblePerms = newPossiblePerms; newPossiblePerms.clear(); } return; } void orderCoins() { possiblePerms.clear(); generatePerms({}); int x = getLightest(1, 2, 3); vector<vector<int> > newPossiblePerms; // cout << possiblePerms.size() << " possiblities\n"; for (auto i : possiblePerms) { if (vectorFind(i, x) > vectorFind(i, 1)) { continue; } if (vectorFind(i, x) > vectorFind(i, 2)) { continue; } if (vectorFind(i, x) > vectorFind(i, 3)) { continue; } newPossiblePerms.push_back(i); } possiblePerms = newPossiblePerms; newPossiblePerms.clear(); // cout << possiblePerms.size() << " possiblities\n"; x = getLightest(4, 5, 6); for (auto i : possiblePerms) { if (vectorFind(i, x) > vectorFind(i, 4)) { continue; } if (vectorFind(i, x) > vectorFind(i, 5)) { continue; } if (vectorFind(i, x) > vectorFind(i, 6)) { continue; } newPossiblePerms.push_back(i); } possiblePerms = newPossiblePerms; newPossiblePerms.clear(); while (possiblePerms.size() > 1) { optimalQuestion(); } int finalAnswer[6]; for (int i = 0; i < 6; i++) { finalAnswer[i] = possiblePerms[0][i]; } answer(finalAnswer); return; }

Compilation message (stderr)

scales.cpp: In function 'int vectorFind(std::vector<int>, int)':
scales.cpp:14:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   14 |     for (int i = 0; i < v.size(); i++)
      |                     ~~^~~~~~~~~~
scales.cpp: In function 'int checkOther(int, int, int, int)':
scales.cpp:117:20: warning: unused parameter 'a' [-Wunused-parameter]
  117 | int checkOther(int a, int b, int c, int d) {
      |                ~~~~^
scales.cpp:117:27: warning: unused parameter 'b' [-Wunused-parameter]
  117 | int checkOther(int a, int b, int c, int d) {
      |                       ~~~~^
scales.cpp:117:34: warning: unused parameter 'c' [-Wunused-parameter]
  117 | int checkOther(int a, int b, int c, int d) {
      |                              ~~~~^
scales.cpp:117:41: warning: unused parameter 'd' [-Wunused-parameter]
  117 | int checkOther(int a, int b, int c, int d) {
      |                                     ~~~~^
scales.cpp: In function 'void optimalQuestion()':
scales.cpp:124:27: warning: variable 'mind' set but not used [-Wunused-but-set-variable]
  124 |     int mina, minb, minc, mind;
      |                           ^~~~
scales.cpp:16:9: warning: 'minc' may be used uninitialized in this function [-Wmaybe-uninitialized]
   16 |         if (v[i] == a)
      |         ^~
scales.cpp:124:21: note: 'minc' was declared here
  124 |     int mina, minb, minc, mind;
      |                     ^~~~
scales.cpp:16:9: warning: 'minb' may be used uninitialized in this function [-Wmaybe-uninitialized]
   16 |         if (v[i] == a)
      |         ^~
scales.cpp:124:15: note: 'minb' was declared here
  124 |     int mina, minb, minc, mind;
      |               ^~~~
scales.cpp:16:9: warning: 'mina' may be used uninitialized in this function [-Wmaybe-uninitialized]
   16 |         if (v[i] == a)
      |         ^~
scales.cpp:124:9: note: 'mina' was declared here
  124 |     int mina, minb, minc, mind;
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...