poj 2643 stl_map(竞选啦)

题意:一些人竞选。首先给出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;
}


你可能感兴趣的:(poj 2643 stl_map(竞选啦))