HDU2094 产生冠军
产生冠军Time Limit: 1000/1000 MS (Java/Others)??? Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 26594??? Accepted Submission(s): 11947 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。 Input 输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。 Output 对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。 Sample Input
Sample Output
顺便补一下STL的set容器知识: 在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。 set使用方法: begin()????,返回set容器的第一个迭代器 end() ,返回set容器的最后一个迭代器 clear()???????,删除set容器中的所有的元素 empty() ,判断set容器是否为空 max_size() ,返回set容器可能包含的元素最大个数 size() ,返回当前set容器中的元素个数 rbegin ,返回的值和end()相同 rend() ,返回的值和rbegin()相同
#include <iostream> #include <set> using namespace std; int main() { set<int> s; s.insert(1); s.insert(2); s.insert(3); s.insert(1); cout<<"set 的 size 值为 :"<<s.size()<<endl; cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl; cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl; cout<<"set 中的最后一个元素是:"<<*s.end()<<endl; s.clear(); if(s.empty()) { cout<<"set 为空 !!!"<<endl; } cout<<"set 的 size 值为 :"<<s.size()<<endl; cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl; return 0; } 小结:插入3之后虽然插入了一个1,但是我们发现set中最后一个值仍然是3哈,这就是set 。还要注意begin() 和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空. count()方法: count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。 实例代码: #include <iostream> #include <set> using namespace std; int main() { set<int> s; s.insert(1); s.insert(2); s.insert(3); s.insert(1); cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl; cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl; return 0; } erase()方法: erase(iterator)?,删除定位器iterator指向的值 erase(first,second),删除定位器first和second之间的值 erase(key_value),删除键值key_value的值 #include <iostream> #include <set> using namespace std; int main() { set<int> s; set<int>::const_iterator iter; set<int>::iterator first; set<int>::iterator second; for(int i = 1 ; i <= 10 ; ++i) { s.insert(i); } //第一种删除 s.erase(s.begin()); //第二种删除 first = s.begin(); second = s.begin(); second++; second++; s.erase(first,second); //第三种删除 s.erase(8); cout<<"删除后 set 中元素是 :"; for(iter = s.begin() ; iter != s.end() ; ++iter) { cout<<*iter<<" "; } cout<<endl; return 0; } 小结:set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。 find()方法: find()? ,返回给定值值得定位器,如果没找到则返回end()。 #include <iostream> #include <set> using namespace std; int main() { int a[] = { 4,6,2,3}; set<int> s(a,a + 4); set<int>::iterator iter; for(iter = s.begin();iter != s.end();iter++) { cout << *iter << " " ; } cout << endl; if((iter = s.find(2)) != s.end()) cout<<*iter<<endl; if((iter = s.find(1)) != s.end()) cout<<*iter<<endl; return 0; } 运行结果: 2 3 4 6 2 小结:find(x)是返回的是x的值,如果x没有在set中则会输出end(); lower_bound(key_value) ,返回第一个大于等于key_value的定位器 upper_bound(key_value),返回最后一个大于key_value的定位器 #include <iostream> #include <set> using namespace std; int main() { set<int> s; for(int i = 1;i <= 5;i ++) { int x; cin >> x; s.insert(x); } set<int>::iterator iter; for(iter = s.begin() ; iter != s.end() ; ++iter) { cout << *iter << " "; } cout << endl; cout << "第一个大于等于 2 的值是: "; cout<<*s.lower_bound(2)<<endl; cout << "第一个大于等于 3 的值是: "; cout<<*s.lower_bound(3)<<endl; cout << "第一个大于 3 的值是: "; cout<<*s.upper_bound(3)<<endl; return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |