제출 #41711

#제출 시각아이디문제언어결과실행 시간메모리
41711funcsr저울 (IOI15_scales)C++14
45.45 / 100
2 ms604 KiB
#include "scales.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <cassert>
using namespace std;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(x) x.begin(), x.end()
#define uniq(x) x.erase(unique(all(x)), x.end())
#define index(x, y) (int)(lower_bound(all(x), y) - x.begin())
#define pb push_back
#define _1 first
#define _2 second
typedef pair<int, int> P;

void init(int T) {}

void solve3(vector<int> rest, vector<int> &ret) {
  //cout<<"solve3("<<rest[0]<<","<<rest[1]<<","<<rest[2]<<")\n";
  assert(rest.size() == 3);
  int a = getHeaviest(rest[0], rest[1], rest[2]);
  int b = getMedian(rest[0], rest[1], rest[2]);
  ret.pb(a);
  ret.pb(b);
  for (int x : rest) if (x != a && x != b) ret.pb(x);
}
void solve4(vector<int> rest, vector<int> &ret) {
  assert(rest.size() == 4);
  // +2
  int a = getHeaviest(rest[0], rest[1], rest[2]);
  int b = getHeaviest(rest[0], rest[1], rest[3]);
  int mx = -1;
  bool yo = false;
  if (a == b) mx = a;
  else if (a == rest[0] || a == rest[1]) mx = b;
  else if (b == rest[0] || b == rest[1]) mx = a;
  else {
    yo = true;
    // +1
    assert(a == rest[2] && b == rest[3]);
    int tekitou = -1;
    for (int x : rest) if (x != a && x != b) tekitou = x;
    if (getHeaviest(a, b, tekitou) == a) {
      mx = a;
    }
    else {
      mx = b;
    }
  }
  if (!yo) getHeaviest(rest[0], rest[1], rest[2]);
  ret.pb(mx);
  vector<int> new_rest;
  for (int x : rest) if (x != mx) new_rest.pb(x);
  solve3(new_rest, ret);
}

void orderCoins() {
  int max_123 = getHeaviest(1, 2, 3);
  int max_456 = getHeaviest(4, 5, 6);
  int tekitou = 1;
  while (tekitou==max_123 || tekitou==max_456) tekitou++;
  vector<int> ret;
  if (getHeaviest(max_123, max_456, tekitou) == max_123) {
    vector<int> x;
    for (int i=1; i<=3; i++) if (i != max_123) x.pb(i);
    ret.pb(max_123);
    int sec = getHeaviest(x[0], x[1], max_456);
    ret.pb(sec);
    vector<int> rest;
    for (int i=1; i<=6; i++) if (i != max_123 && i != sec) rest.pb(i);
    solve4(rest, ret);
  }
  else {
    vector<int> x;
    for (int i=4; i<=6; i++) if (i != max_456) x.pb(i);
    ret.pb(max_456);
    int sec = getHeaviest(x[0], x[1], max_123);
    ret.pb(sec);
    vector<int> rest;
    for (int i=1; i<=6; i++) if (i != max_456 && i != sec) rest.pb(i);
    solve4(rest, ret);
  }
  assert(ret.size() == 6);
  reverse(all(ret));
  int W[] = {ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]};
  //cout<<"["; rep(i, 6)cout<<W[i]<<",";cout<<"]\n";
  answer(W);
}

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

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