提出 #461911


ソースコード 拡げる

#include <bits/stdc++.h>
#define EPS 1e-9
#define INF 1070000000LL
#define MOD 1000000007LL
#define fir first
#define foreach(it,X) for(auto it=(X).begin();it!=(X).end();it++)
#define numa(x,a) for(auto x: a)
#define ite iterator
#define mp make_pair
#define rep(i,n) rep2(i,0,n)
#define rep2(i,m,n) for(int i=m;i<(n);i++)
#define pb push_back
#define pf push_front
#define sec second
#define sz(x) ((int)(x).size())
#define ALL( c ) (c).begin(), (c).end()
#define gcd(a,b) __gcd(a,b)
#define mem(x,n) memset(x,n,sizeof(x))
#define endl "\n"
using namespace std;
template <int POS, class TUPLE> void deploy(std::ostream &os, const TUPLE &tuple){}
template <int POS, class TUPLE, class H, class ...Ts> void deploy(std::ostream &os, const TUPLE &t){ os << (POS == 0 ? "" : ", ") << get<POS>(t); deploy<POS + 1, TUPLE, Ts...>(os, t); }
template <class T,class U> std::ostream& operator<<(std::ostream &os, std::pair<T,U> &p){ os << "(" << p.first <<", " << p.second <<")";return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::vector<T> &v){ int remain = v.size(); os << "{"; for(auto e: v) os << e << (--remain == 0 ? "}" : ", "); return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::set<T> &v){ int remain = v.size(); os << "{"; for(auto e: v) os << e << (--remain == 0 ? "}" : ", "); return os; }
template <class T, class K> std::ostream& operator<<(std::ostream &os, std::map<T, K> &mp){ int remain = mp.size(); os << "{"; for(auto e: mp) os << "(" << e.first << " -> " << e.second << ")" << (--remain == 0 ? "}" : ", "); return os; }
#define DEBUG1(var0) { std::cerr << (#var0) << "=" << (var0) << endl; }
#define DEBUG2(var0, var1) { std::cerr << (#var0) << "=" << (var0) << ", ";DEBUG1(var1); }
#define DEBUG3(var0, var1, var2) { std::cerr << (#var0) << "=" << (var0) << ", ";DEBUG2(var1,var2); }
#define DEBUG4(var0, var1, var2, var3) { std::cerr << (#var0) << "=" << (var0) << ", ";DEBUG3(var1,var2,var3); }
using ll = long long;

int ans[30];
int ans_size = 0;
vector <string> players;
map <string, int> memo;
vector <pair <int,bool> > hints;
int N;
//int gbarray[30];
bool cur_goods[30];

bool OK(int y){
  //mem(gbarray,-1);
  for (int b = 0; b < N; b++) {
    if ((1<<b) & y) {
      cur_goods[b] = true;
    }else{
      cur_goods[b] = false;
    }
  }
  
  for (int b = 0; b < N; b++) {
    auto x = hints[b];
    if (!cur_goods[b]) {
      x.sec = !x.sec;
    }
    if (x.sec) {
      if (!cur_goods[x.fir]) {
        return false;
      }
    }else{
      if (cur_goods[x.fir]) {
        return false;
      }
    }
  }
  return true;
}

bool less_(vector <string> &a, vector <string> &b) {
  //a < b
  for (int i = 0; i < sz(a); i++) {
    if (a[i] < b[i]) {
      return true;
    }
    if (a[i] > b[i]) {
      return false;
    }
  }
  return true;
}


int main()
{
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  
  cin >> N;
  players.resize(N);
  rep(i,N){
    cin >> players[i];
    memo[players[i]] = i;
  }
  hints.resize(N);
  rep(i,N){
    string p;
    cin >> p;
    string is,a,gb,ven;
    cin >> is >> a >> gb >> ven;
    if (gb == "good") {
      hints[i] = mp(memo[p], true);
    }else{
      hints[i] = mp(memo[p], false);
    }
  }
  vector <string> ans_p;

  rep2(i,1,1<<N){

    if (__builtin_popcount (i) < ans_size) {
      continue;
    }
    int cur_ans_size;
    if (OK(i)) {
      int cnt = 0;
      for (int b = 0; b < N; b++) {
        if ((1<<b) & i) {
          ans[cnt++] = b;
        }
      }
      cur_ans_size = cnt;
    }else{
      continue;
    }  

    if (cur_ans_size == ans_size) {
      vector <string> cur_ans_p(cur_ans_size);
      rep(i,cur_ans_size){
        cur_ans_p[i] = players[ans[i]];
      }
      sort(ALL(cur_ans_p));
      if (less_(cur_ans_p, ans_p)) {
        swap(cur_ans_p, ans_p);
      }
    }else{
      ans_p.clear();
      ans_p.resize(cur_ans_size);
      rep(i,cur_ans_size){
        ans_p[i] = players[ans[i]];
      }
      sort(ALL(ans_p));
      ans_size = cur_ans_size;
    }
  }
  if (ans_size == 0) {
    cout << "No answers\n";
    return 0;
  }
  for (auto &s : ans_p) {
    cout << s << endl;
  }
  return 0;
}

提出情報

提出日時
問題 C - 酒場の冒険者たち
ユーザ maguro
言語 C++11 (GCC 4.9.2)
得点 100
コード長 4310 Byte
結果 AC
実行時間 75 ms
メモリ 932 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 27
セット名 テストケース
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 01_max_00.txt, 01_max_01.txt, 05_corner_00.txt, 05_corner_01.txt, 05_corner_02.txt, 10_min_00.txt, 10_min_01.txt, 10_min_02.txt, 10_wrong_answer_00.txt, 20_max_00.txt, 20_max_01.txt, 20_max_02.txt, 90_random_00.txt, 90_random_01.txt, 90_random_02.txt, 90_random_03.txt, 90_random_04.txt, 90_random_05.txt, 90_random_06.txt, 90_random_07.txt, 90_random_08.txt, 90_random_09.txt, 99_medium_00.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 23 ms 804 KiB
00_sample_01.txt AC 23 ms 924 KiB
00_sample_02.txt AC 22 ms 796 KiB
00_sample_03.txt AC 22 ms 800 KiB
01_max_00.txt AC 31 ms 796 KiB
01_max_01.txt AC 68 ms 796 KiB
05_corner_00.txt AC 22 ms 924 KiB
05_corner_01.txt AC 22 ms 800 KiB
05_corner_02.txt AC 22 ms 796 KiB
10_min_00.txt AC 24 ms 796 KiB
10_min_01.txt AC 22 ms 928 KiB
10_min_02.txt AC 24 ms 924 KiB
10_wrong_answer_00.txt AC 25 ms 928 KiB
20_max_00.txt AC 75 ms 924 KiB
20_max_01.txt AC 72 ms 800 KiB
20_max_02.txt AC 65 ms 928 KiB
90_random_00.txt AC 24 ms 932 KiB
90_random_01.txt AC 75 ms 928 KiB
90_random_02.txt AC 23 ms 928 KiB
90_random_03.txt AC 22 ms 928 KiB
90_random_04.txt AC 25 ms 920 KiB
90_random_05.txt AC 24 ms 928 KiB
90_random_06.txt AC 73 ms 796 KiB
90_random_07.txt AC 24 ms 924 KiB
90_random_08.txt AC 24 ms 804 KiB
90_random_09.txt AC 34 ms 800 KiB
99_medium_00.txt AC 23 ms 800 KiB