题意:
有n给人,每个人有m[i]张点数均不同的卡片,现在主持人没喊一个数持对应点数卡片的人能走卡片的步数,某人先走完自己手中全部卡片的获胜,问你在每个人都最有利的情况下每个人的获胜情况。
思路:
题意理解了半天。。。。。其实就是每个人都自己按照自己的卡片走,如果在自己走完之前,已经有人按照和自己一样的方式走完了,那么这个人必输。说白了就是对每个人去其他人的卡片堆中找是否有自己卡片点数的子串,如果有自己就必输(因为那个人总能按照你的方法走而且比你先走完、同时走完的也算输)。
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int MAX=105;
int n,m[MAX],v;
set<int> se[MAX];
set<int>::iterator it;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&m[i]);
for(int j=0;j<m[i];j++){
scanf("%d",&v);
se[i].insert(v);
}
}
for(int i=0;i<n;i++){
bool flag=true;
for(int j=0;j<n;j++){
if(i==j) continue;
bool ok=false;
for(it=se[j].begin();it!=se[j].end();it++){
if(se[i].find(*it)==se[i].end()){
ok=true;
break;
}
}
if(ok==false){
flag=false;
break;
}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}