十足水题,拿来练手速的,做完之后从别人那里学了点东西:
STL的string类中有如下用于查找的函数
find_first_of (char *s,int pos) //从pos开始查找第一个s字符集的某字符出现在串中的位置,成功时返回所在位置 find_last_of find_first_not_of find_last_not_of
题意:足球比赛,给出n(保证是偶数)支队伍的队名和的对阵结果,有一半的队伍出线,按照字典序输出出线的队伍。排序规则:得分胜3平1负0,分数相等比较净胜球,净胜球相等比较进球数。
#include <iostream> #include <cstdio> #include <map> #include <cstring> #include <string> #include <algorithm> using namespace std; struct Data { int num; string name; int dif,score; Data () {num=0,dif=0,score=0;} ~Data () {} bool operator < (const Data& b) const { if (num!=b.num) return num>b.num; else if (dif!=b.dif) return dif>b.dif; else if (score!=b.score) return score>b.score; return false; } }data[105]; bool cmp (const Data &a,const Data &b) { if (a.name<b.name) return true; return false; } char str[105],str2[105]; int n; map<string,int> mp; void In () { int i; scanf("%s",str); for (i=0;true;i++) if (str[i]=='-') { str[i]=0; break; } strcpy(str2,str+i+1); } int main () { while (~scanf("%d",&n)) { int i; mp.clear(); for (i=0;i<n;i++) { cin>>data[i].name; mp[ data[i].name ]=i; } int a,b,id1,id2; for (i=1;i<=n*(n-1)/2;i++) { In (); scanf("%d:%d",&a,&b); id1=mp[str]; id2=mp[str2]; data[id1].score+=a; data[id1].dif+=a-b; data[id2].score+=b; data[id2].dif+=b-a; if (a>b) data[id1].num+=3; else if (a<b) data[id2].num+=3; else if (a==b) data[id1].num+=1,data[id2].num+=1; } sort(data,data+n); sort(data,data+n/2,cmp); for (i=0;i<n/2;i++) cout<<data[i].name<<endl; } return 0; }