hdu 2094 产生冠军
http://acm.hdu.edu.cn/showproblem.php?pid=2094
思路:
冠军只有一个,并且冠军没有被打败。
也就是说,记录下选手是否被打败过,如果最后只剩下一个人没有被打败,就能产生冠军,否则就不能。
代码和解析如下:
#include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; struct node { string s; int fail; //fail为1表示被打败过,为0表示没有被打败过 }; int main() { int n,flag1,flag2; vector<node> s0; while (cin>>n &&n!=0) { s0.clear(); //注意每次都要清零 for (int i=0; i<n; i++) { struct node s1,s2; cin>>s1.s>>s2.s; flag1=flag2=0; for(int j=0;j<s0.size();j++) { if(s0[j].s==s1.s)
flag1=1; if(s0[j].s==s2.s) //如果已经记录过输的选手的信息,则将他标记为输 { flag2=1; s0[j].fail=1; } if(flag1==1&&flag2==1) break; } if(flag1==0) //如果没有记录过赢的选手的信息,则保存在向量中,暂且标记为赢
{
s1.fail=0;
s0.push_back(s1);
} if(flag2==0) //如果没有记录过输的选手的信息,则保存进向量,并将他标记为输 { s2.fail=1; s0.push_back(s2); } } int count=0,i; for(i=0;i<s0.size();i++) { if(s0[i].fail==0) count++; } if(count==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }