10月5日备战Noip2018模拟赛7(B组)
T1 Voting 兔子选举
题目描述
兔子常常感到孤独,所以一组的兔子决定走到一起,并举行选美比赛,以确定它们之间谁拥有最漂亮的耳朵。规则如下:
每只兔提交一票。如果ta投了自己一票,这样的投票被认为是无效的并把这张选票删除。最后,收到的最多有效票者胜出。
给定n只兔子的姓名,以及它所投出的选票。输出获胜的兔子姓名。若不存在唯一的最高选票的兔子,则输出一个空串。
输入格式
输入文件voting.in,有多组测试数据:
第一行,包含一个整数Num,表示测试数据的组数。(1<=Num<=10)
每组测试数据,
第一行一个整数N,表示共有N只兔子。2<=N<=50.
接下来一行,N个字符串,表示N只兔子的名字,数据保证名字不会相同,名字中只包含英文字母,名字长度不超过50个字符,中间用1个空格分隔。最后一行,N个字符串,表示每只兔子的选票,保证是其中一只兔子的名字。
输出格式
输出文件voting.out,共Num行,
每行输出获胜的兔子,若最高选票有多个,输出一个空串。
输入样例
5
4
Alice Bill Carol Dick
Bill Dick Alice Alice
4
Alice Bill Carol Dick
Carol Carol Bill Bill
4
Alice Bill Carol Dick
Alice Alice Bill Bill
2
Alice Bill
Alice Bill
4
WhiteRabbit whiterabbit whiteRabbit Whiterabbit
whiteRabbit whiteRabbit whiteRabbit WhiteRabbit
输出样例
Alice
Bill
whiteRabbit
map真的超级好用呢
map < string, int > vot 表示从string类型(兔子的名字)到int类型(所得票数)的映射
Eg.可爱的兔子Bunny 得到了233票, 那么就可以表示成 vot['Bunny'] = 233;
代码
#include <iostream>
#include <cstdio>
#include <map>
//map要加这个头文件
using namespace std;
const int N = 51;
map <string, int> vot; //尖括号使用时最好加上空格,不然可能会被认为是移位
int num, n, Max;
string s, winner;
string nam[N];
bool b;
int main()
{
//freopen ("voting.in", "r", stdin);
//freopen ("voting.out", "w", stdout);
cin >> num;
for (int t = 1; t <= num; t++){
cin >> n;
for (int i = 1; i <= n; i ++){
cin >> nam[i];
vot[nam[i]] = 0; //把所有兔子的票数初始化为0 (map的用法)
}
Max = 0;
b = 0; //把bool b初始化false,防止所有兔子都很不要脸的投了自己
for (int i = 1; i <= n; i ++){
cin >> s;
if (s != nam[i]){ //判断是否有兔子无耻的投了自己
vot[s] ++;
if (vot[s] > Max){
Max = vot[s];
winner = s;
b = 1;
}
else if (vot[s] == Max) b = 0; //看看是否有兔子的票数一样
}
}
if (Max > 0 && b) cout << winner << endl;
else cout << endl;
}
//fclose (stdin);
//fclose (stdout);
return 0;
}