题意:一些人竞选。首先给出n个人-党对,一个人属于一个党派,人和党派最多出现一次。党派可能是independent(这个可以多于一个)。接着给出m个选票,每张选票是一个人名。输出选票最多的那个人对应的党派,如果有两个人得票同样多,则输出tie。
思路:用stl的map数据结构就容易了。用一个map<string,string>来存放人名子和党派的映射,再用一个map<string,int>num计数即可。注意string类需要用cout输出,如果想用printf输出则需对字符串调用.c_str()方法。不用stl的话就用一个结构体绑定即可。注意:list中出现的名字有可能没在name-patry中出现。
stl:
#include <cstdio> #include <iostream> #include <string> #include <map> #define N 88 using namespace std; char s[N],t[N]; int n; map<string,string>name; map<string,int>num; int main(){ freopen("a.txt","r",stdin); while(scanf("%d\n",&n)!=EOF){ int i,j,max,tie; string temp; for(i = 0;i<n;i++){ gets(s); gets(t); name[s] = t; } scanf("%d\n",&n); max = tie = 0; for(i = 0;i<n;i++){ gets(s); num[s]++; if(num[s] > max){ max = num[s]; temp = s; tie = 0; }else if(num[s] >= max) tie = 1; } if(tie) printf("tie\n"); else printf("%s\n",name[temp].c_str()); //cout<<name[temp]<<endl; } return 0; }
struct:
#include <stdio.h> #include <string.h> #define N 88 struct person{ char name[N],party[N]; int num; }p[27]; int n,m; int find(char x[N]){ int i; for(i = 0;i<n;i++) if(!strcmp(p[i].name,x)) return i; return -1; } int main(){ freopen("a.txt","r",stdin); while(scanf("%d",&n)!=EOF){ int i,j,id,max,tie;getchar(); for(i = 0;i<n;i++){ gets(p[i].name); gets(p[i].party); p[i].num=0; } scanf("%d",&m);getchar(); id = max = 0; tie = 1; for(i = 0;i<m;i++){ char temp[N]; gets(temp); j = find(temp); if(j == -1)//有可能list中的没在name-patry中出现 continue; p[j].num++; if(p[j].num > max){ max = p[j].num; id = j; tie = 0; }else if(p[j].num == max) tie = 1; } if(tie) printf("tie\n"); else printf("%s\n",p[id].party); } return 0; }