PKU 1029 False coin
i番目のコインが偽者と仮定して、計量の結果と矛盾が無いか調べる。矛盾の無いコインがちょうど1枚ならば、そのコインが偽者。
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool contain( vector<int> v, int c ) { return find( v.begin(), v.end(), c ) != v.end(); } int main() { int N, K; cin >> N >> K; vector<vector<int> > left(K); vector<vector<int> > right(K); vector<char> result(K); for ( int i=0; i<K; i++ ) { int n; cin >> n; left[i].resize(n); right[i].resize(n); for ( int j=0; j<n; j++ ) cin >> left[i][j]; for ( int j=0; j<n; j++ ) cin >> right[i][j]; cin >> result[i]; } vector<int> falsecoin; for ( int c=1; c<=N; c++ ) for ( int w=-1; w<=1; w+=2 ) { bool f = true; for ( int i=0; i<K; i++ ) if ( result[i]=='<' && w<0 && !contain(left [i],c) || result[i]=='<' && w>0 && !contain(right[i],c) || result[i]=='>' && w<0 && !contain(right[i],c) || result[i]=='>' && w>0 && !contain(left [i],c) || result[i]=='=' && contain(left [i],c) || result[i]=='=' && contain(right[i],c) ) f = false; if ( f && ! contain(falsecoin,c) ) falsecoin.push_back( c ); } cout << ( falsecoin.size()==1 ? falsecoin[0] : 0 ) << endl; return 0; }