# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
115515 |
2019-06-08T02:53:30 Z |
E869120 |
Scales (IOI15_scales) |
C++14 |
|
529 ms |
640 KB |
#include "scales.h"
#include <bits/stdc++.h>
using namespace std;
void init(int T) {
/* ... */
}
vector<int>vec;
int Query_1(int u1, int u2, int u3) {
int id1, id2, id3;
for (int i = 0; i < 6; i++) { if (u1 == vec[i]) id1 = i; }
for (int i = 0; i < 6; i++) { if (u2 == vec[i]) id2 = i; }
for (int i = 0; i < 6; i++) { if (u3 == vec[i]) id3 = i; }
pair<int, int> G[3] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3)};
sort(G, G + 3);
return G[0].second;
}
int Query_2(int u1, int u2, int u3) {
int id1, id2, id3;
for (int i = 0; i < 6; i++) { if (u1 == vec[i]) id1 = i; }
for (int i = 0; i < 6; i++) { if (u2 == vec[i]) id2 = i; }
for (int i = 0; i < 6; i++) { if (u3 == vec[i]) id3 = i; }
pair<int, int> G[3] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3)};
sort(G, G + 3);
return G[1].second;
}
int Query_3(int u1, int u2, int u3) {
int id1, id2, id3;
for (int i = 0; i < 6; i++) { if (u1 == vec[i]) id1 = i; }
for (int i = 0; i < 6; i++) { if (u2 == vec[i]) id2 = i; }
for (int i = 0; i < 6; i++) { if (u3 == vec[i]) id3 = i; }
pair<int, int> G[3] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3)};
sort(G, G + 3);
return G[2].second;
}
int Query_4(int u1, int u2, int u3, int u4) {
int id1, id2, id3, id4;
for (int i = 0; i < 6; i++) { if (u1 == vec[i]) id1 = i; }
for (int i = 0; i < 6; i++) { if (u2 == vec[i]) id2 = i; }
for (int i = 0; i < 6; i++) { if (u3 == vec[i]) id3 = i; }
for (int i = 0; i < 6; i++) { if (u4 == vec[i]) id4 = i; }
pair<int, int> G[4] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3), make_pair(id4, u4)};
sort(G, G + 4);
for (int i = 0; i < 3; i++) {
if (G[i].second == u4) return G[i + 1].second;
}
return G[0].second;
}
int CountMinimumPossibleMove(vector<vector<int>>vec1) {
vector<vector<int>> minid[7]; int minx = (1 << 30);
tuple<int, int, int, int, int> E;
// Query 2: getMedian
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_2(i, j, k)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
if (minv < minx) { minx = minv; E = make_tuple(2, i, j, k, -1); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
// Query 1: getLightest
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_1(i, j, k)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
if (minv < minx) { minx = minv; E = make_tuple(1, i, j, k, -1); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
// Query 3: getHeaviest
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_3(i, j, k)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
if (minv < minx) { minx = minv; E = make_tuple(3, i, j, k, -1); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
// Query 4: getNextLightest
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
for (int t = 1; t <= 6; t++) {
if (i == t || j == t || k == t) continue;
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_4(i, j, k, t)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
if (minv < minx) { minx = minv; E = make_tuple(4, i, j, k, t); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
}
return minx;
}
vector<vector<int>> nextPossibleMove(vector<vector<int>> vec1) {
vector<vector<int>> minid[7]; int minx = (1 << 30);
tuple<int, int, int, int, int> E; bool complete = false;
int B = 27;
if (vec1.size() >= 200) B = 27;
else if (vec1.size() >= 50) B = 9;
// Query 2: getMedian
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
if (complete == true) continue;
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_2(i, j, k)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
bool flag = true;
if (vec1.size() >= 50 && vec1.size() <= 250 && minv <= B * 3) {
for (int l = 1; l <= 6; l++) { if (CountMinimumPossibleMove(sum[l]) > B) flag = false; }
}
else flag = false;
if (flag == true) complete = true;
if (minv < minx || (minv == minx && flag == true)) { minx = minv; E = make_tuple(2, i, j, k, -1); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
// Query 1: getLightest
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
if (complete == true) continue;
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_1(i, j, k)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
bool flag = true;
if (vec1.size() >= 50 && vec1.size() <= 250 && minv <= B * 3) {
for (int l = 1; l <= 6; l++) { if (CountMinimumPossibleMove(sum[l]) > B) flag = false; }
}
else flag = false;
if (flag == true) complete = true;
if (minv < minx || (minv == minx && flag == true)) { minx = minv; E = make_tuple(1, i, j, k, -1); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
// Query 3: getHeaviest
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
if (complete == true) continue;
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_3(i, j, k)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
bool flag = true;
if (vec1.size() >= 50 && vec1.size() <= 250 && minv <= B * 3) {
for (int l = 1; l <= 6; l++) { if (CountMinimumPossibleMove(sum[l]) > B) flag = false; }
}
else flag = false;
if (flag == true) complete = true;
if (minv < minx || (minv == minx && flag == true)) { minx = minv; E = make_tuple(3, i, j, k, -1); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
// Query 4: getNextLightest
for (int i = 1; i <= 6; i++) {
for (int j = i + 1; j <= 6; j++) {
for (int k = j + 1; k <= 6; k++) {
for (int t = 1; t <= 6; t++) {
if (complete == true) continue;
if (i == t || j == t || k == t) continue;
vector<vector<int>> sum[7];
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_4(i, j, k, t)].push_back(vec1[l]); }
int minv = 0; for (int l = 1; l <= 6; l++) minv = max(minv, (int)sum[l].size()); //cout << minv << " ";
bool flag = true;
if (vec1.size() >= 50 && vec1.size() <= 250 && minv <= B * 3) {
for (int l = 1; l <= 6; l++) { if (CountMinimumPossibleMove(sum[l]) > B) flag = false; }
}
else flag = false;
if (flag == true) complete = true;
if (minv < minx || (minv == minx && flag == true)) { minx = minv; E = make_tuple(4, i, j, k, t); for (int l = 1; l <= 6; l++) minid[l] = sum[l]; }
}
}
}
}
// Summarize
int G = 0;
if (get<0>(E) == 1) G = getLightest(get<1>(E), get<2>(E), get<3>(E));
if (get<0>(E) == 2) G = getMedian(get<1>(E), get<2>(E), get<3>(E));
if (get<0>(E) == 3) G = getHeaviest(get<1>(E), get<2>(E), get<3>(E));
if (get<0>(E) == 4) G = getNextLightest(get<1>(E), get<2>(E), get<3>(E), get<4>(E));
return minid[G];
}
vector<int> solve() {
vector<vector<int>> J; vector<int> K = {1, 2, 3, 4, 5, 6};
do{
J.push_back(K);
}while(next_permutation(K.begin(), K.end()));
while (J.size() >= 2) {
//cout << J.size() << endl;
J = nextPossibleMove(J);
}
return J[0];
}
void orderCoins() {
vector<int> A = solve();
int FinalAns[6]; for (int i = 0; i < A.size(); i++) FinalAns[i] = A[i];
answer(FinalAns);
}
Compilation message
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 'void init(int)':
scales.cpp:5:15: warning: unused parameter 'T' [-Wunused-parameter]
void init(int T) {
^
scales.cpp: In function 'int CountMinimumPossibleMove(std::vector<std::vector<int> >)':
scales.cpp:69:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_2(i, j, k)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp:82:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_1(i, j, k)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp:95:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_3(i, j, k)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp:110:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_4(i, j, k, t)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp: In function 'std::vector<std::vector<int> > nextPossibleMove(std::vector<std::vector<int> >)':
scales.cpp:135:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_2(i, j, k)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp:158:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_1(i, j, k)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp:181:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_3(i, j, k)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp:205:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int l = 0; l < vec1.size(); l++) { vec = vec1[l]; sum[Query_4(i, j, k, t)].push_back(vec1[l]); }
~~^~~~~~~~~~~~~
scales.cpp: In function 'void orderCoins()':
scales.cpp:247:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
int FinalAns[6]; for (int i = 0; i < A.size(); i++) FinalAns[i] = A[i];
~~^~~~~~~~~~
scales.cpp: In function 'int Query_4(int, int, int, int)':
scales.cpp:51:103: warning: 'id4' may be used uninitialized in this function [-Wmaybe-uninitialized]
pair<int, int> G[4] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3), make_pair(id4, u4)};
^
scales.cpp:51:103: warning: 'id3' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp:51:103: warning: 'id2' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp:51:103: warning: 'id1' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp: In function 'int Query_1(int, int, int)':
scales.cpp:17:83: warning: 'id3' may be used uninitialized in this function [-Wmaybe-uninitialized]
pair<int, int> G[3] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3)};
^
scales.cpp:17:83: warning: 'id2' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp:17:83: warning: 'id1' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp: In function 'int Query_2(int, int, int)':
scales.cpp:28:83: warning: 'id3' may be used uninitialized in this function [-Wmaybe-uninitialized]
pair<int, int> G[3] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3)};
^
scales.cpp:28:83: warning: 'id2' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp:28:83: warning: 'id1' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp: In function 'int Query_3(int, int, int)':
scales.cpp:39:83: warning: 'id3' may be used uninitialized in this function [-Wmaybe-uninitialized]
pair<int, int> G[3] = {make_pair(id1, u1), make_pair(id2, u2), make_pair(id3, u3)};
^
scales.cpp:39:83: warning: 'id2' may be used uninitialized in this function [-Wmaybe-uninitialized]
scales.cpp:39:83: warning: 'id1' may be used uninitialized in this function [-Wmaybe-uninitialized]
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
351 ms |
512 KB |
Output is correct |
2 |
Correct |
343 ms |
632 KB |
Output is correct |
3 |
Correct |
529 ms |
512 KB |
Output is correct |
4 |
Correct |
344 ms |
512 KB |
Output is correct |
5 |
Correct |
359 ms |
632 KB |
Output is correct |
6 |
Correct |
345 ms |
512 KB |
Output is correct |
7 |
Correct |
340 ms |
528 KB |
Output is correct |
8 |
Correct |
339 ms |
512 KB |
Output is correct |
9 |
Correct |
341 ms |
512 KB |
Output is correct |
10 |
Correct |
350 ms |
512 KB |
Output is correct |
11 |
Correct |
335 ms |
512 KB |
Output is correct |
12 |
Correct |
353 ms |
632 KB |
Output is correct |
13 |
Correct |
345 ms |
512 KB |
Output is correct |
14 |
Correct |
346 ms |
632 KB |
Output is correct |
15 |
Correct |
346 ms |
640 KB |
Output is correct |
16 |
Correct |
356 ms |
512 KB |
Output is correct |
17 |
Correct |
357 ms |
632 KB |
Output is correct |
18 |
Correct |
373 ms |
632 KB |
Output is correct |
19 |
Correct |
342 ms |
512 KB |
Output is correct |
20 |
Correct |
347 ms |
512 KB |
Output is correct |
21 |
Correct |
337 ms |
632 KB |
Output is correct |
22 |
Correct |
347 ms |
604 KB |
Output is correct |
23 |
Correct |
361 ms |
512 KB |
Output is correct |
24 |
Correct |
341 ms |
512 KB |
Output is correct |
25 |
Correct |
345 ms |
512 KB |
Output is correct |
26 |
Correct |
374 ms |
632 KB |
Output is correct |
27 |
Correct |
350 ms |
632 KB |
Output is correct |
28 |
Correct |
356 ms |
632 KB |
Output is correct |
29 |
Correct |
341 ms |
632 KB |
Output is correct |
30 |
Correct |
331 ms |
640 KB |
Output is correct |
31 |
Correct |
333 ms |
512 KB |
Output is correct |
32 |
Correct |
339 ms |
528 KB |
Output is correct |
33 |
Correct |
336 ms |
512 KB |
Output is correct |
34 |
Correct |
349 ms |
636 KB |
Output is correct |
35 |
Correct |
336 ms |
512 KB |
Output is correct |
36 |
Correct |
363 ms |
632 KB |
Output is correct |
37 |
Correct |
351 ms |
632 KB |
Output is correct |
38 |
Correct |
336 ms |
632 KB |
Output is correct |
39 |
Correct |
349 ms |
632 KB |
Output is correct |
40 |
Correct |
364 ms |
632 KB |
Output is correct |