HDOJ 2094 产生冠军
2016-03-25 21:15
369 查看
感觉这个是主要是考虑人的思维呈现,都可以看出来要想输出Yes,就必须有且仅有一个赢家没输过,所以我们要项要如何实现这个思想呢?
先说下我,刚开始我想用赢家和输家比较查找到所有只赢不输的人,但是刚开始没考虑到赢家里面有相同的,后来发现赢家里面又可能有很多相同的,所以这个方法行不通。
那么我来说一下正确的思想,先找出赢家和输家所有不同的人数,然后减去输家里面不同的人数,那么就得到了只赢不输的人数,如果为1,就符合规则,Yes!
代码如下:
在这里我还得到一个相同思想不同方法的代码,当然ac此题目时我还不会映射map,但是map可以避免重复的情况,所以map的使用参考的别人的,如下
先说下我,刚开始我想用赢家和输家比较查找到所有只赢不输的人,但是刚开始没考虑到赢家里面有相同的,后来发现赢家里面又可能有很多相同的,所以这个方法行不通。
那么我来说一下正确的思想,先找出赢家和输家所有不同的人数,然后减去输家里面不同的人数,那么就得到了只赢不输的人数,如果为1,就符合规则,Yes!
代码如下:
#include<iostream> #include<cstring> using namespace std; int main() { int n; char str[1005][20]; while(cin>>n,n) { int same1=0,same2=0,different1,different2; for(int i=0;i<n*2;i++) cin>>str[i]; for(int i=0;i<n*2;i++) for(int j=i+1;j<n*2;j++) { if(strcmp(str[i],str[j])==0) { same1++; break;//找到相同的就退出,不然会多计数 } } different1=n*2-same1;//赢输的所有参赛者里面有多少不同的 for(int i=1;i<n*2;i+=2) for(int j=i+2;j<n*2;j+=2)//注意这个循环只对输的人扫描 { if(strcmp(str[i],str[j])==0) { same2++; break; } } different2=n-same2;//输的参赛者有多少不同的 if(different1-different2==1)//只有一个人只赢不败 cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
在这里我还得到一个相同思想不同方法的代码,当然ac此题目时我还不会映射map,但是map可以避免重复的情况,所以map的使用参考的别人的,如下
#include<iostream> #include<map> using namespace std; const int INF=-100000000; int main() { int n; char a[1005][20],b[1005][20]; while(cin>>n,n) { map<string,int> sum; for(int i=0;i<n;i++) { cin>>a[i]>>b[i]; sum[a[i]]++;//赢的人 sum[b[i]]=INF;//败的人 } map<string,int>::iterator it; int ans=0; for(it=sum.begin();it!=sum.end();it++) if((it->second)>0) ans++; if(ans==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
相关文章推荐
- android 标题栏title开源库集成
- 3月25日 javascript练习
- Java网络编程(UDP协议:接收端)
- 畅通工程续——E
- 20行左右的(HTML和JS)代码实现的贪吃蛇游戏
- Activity的四种状态
- PHP异常处理
- Java网络编程(UDP协议:发送端)
- CacheManager
- test 03
- jquery remove() empty()
- JS控制网页文字大小,使其能够自适应屏幕大小
- 深入理解C指针学习笔记---多级指针的内存分配问题(五)
- 数组指针与指针数组
- STL之map的一种用法
- PAT Basic level practise 1004
- Java的并发
- PAT (Advanced Level) Practise 1097 Deduplication on a Linked List (25)
- jquery之attr()和removeAttr() prop的使用场所
- 面试准备android(一)