题目链接:
hdu 2094 产生冠军
思路
如果所有人中只有一个从没输过的就是冠军
有没有可能输过也是冠军的?
不可能,只要输过那么赢他的人就更是冠军了
所以这题很简单啊!我当时怎么想不明白呢
因为我总害怕各种极端情况可能导致我的推论是错误的
智商骤降导致丧失推理能力了吗??
#include<iostream>
#include<cstring>
#include<map>
#include<set>
using namespace std;
map<string,int> m;
set<string>s;//set和map实际上都是一颗平衡树,自动把大的元素放在栈顶,而map比set多了一个类似hash函数的映射功能
int main(){
int n;
while(cin>>n&&n){
m.clear();
s.clear();
int cnt = 0;
for(int i=0;i<n;++i){
string s1,s2;
cin>>s1>>s2;
//赢的和输的都要进set
s.insert(s1);
s.insert(s2);
//只有输的进map,并且记录输的次数
m[s2] ++;
}
set<string> :: iterator i;
for(i=s.begin();i!=s.end();i++){ //i在set里从头到尾扫一次
if(m[*i] == 0){ //当前指向的人如果没输过就cnt++
cnt++;
}
}
if(cnt==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}