题目描述
高橋君はテストの結果を採点しています。ところが、高橋君はある問題の正解を忘れてしまいました。この問題は、N人が解答していて、それぞれの人の答えは0以上M以下の整数でした。高橋君は、半分を超える人が同じ答えだった場合、それを正解とすることにしました。
N人のこの問題に対する解答が与えられるので、高橋君は何を正解とするか出力してください。ただし、高橋君が正解を決められない場合、?
を出力してください。
输入格式
Input is given from Standard Input in the following format:
$ N $ $ M $
$ A_1 $ $ A_2 $ ... $ A_N $
- The first line contains two space-separated integers N\ (1\ ≦\ N\ ≦\ 10^5)N (1 ≦ N ≦ 105) and M\ (1\ ≦\ M\ ≦\ 10^5)M (1 ≦ M ≦ 105) .
- The second line contains NN space-separated integers A_1,A1, A_2,A2, ...,..., A_N.AN. For each i\ (1\ ≦\ i\ ≦\ N),i (1 ≦ i ≦ N), A_i\ (0\ ≦\ A_i\ ≦\ M)Ai (0 ≦ Ai ≦ M) represents the answer of the i^{th}ith student.
输出格式
If Mr. Takahashi is going to assume the correct answer to be some integer X, print the value of X in a single line. Otherwise, print ?
. Be sure to print a newline at the end of output.
题意翻译
题目大意:
高桥君正在编写一份试卷。很不幸的是,他忘记了一个题的正确答案。而他的N个学生用0~M之间的一个整数回答了这个问题。如果有超过一半的学生回答了一个整数X,那么高桥君就认定正确答案是这个整数X。 你会得到这N个学生的回答。如果高桥君打算以X为这道题的正解,那么请输出X。如果他无法以X为这道题的正解,那么请输出"?"(不包括外面的双引号)
输入输出格式:
输入格式:
N M A1 A2 A3... AN 第一行是两个用空格隔开的整数N(1≤N≤10^5)和M(1≤M≤10^5)
第二行是用空格隔开的N个学生们的回答。保证每个学生的回答的整数不大于M 。
输出格式:
如果高桥君认定正确答案为某个整数X,输出一个整数X。 否则,输出"?"。务必在输出结束时输出换行符。
输入输出样例
输入 #1 输出 #1
3 2 2 2 1 2
输入 #2 输出 #2
4 2 ? 2 1 2 1
输入 #3 输出 #3
10 5 ? 0 1 2 3 4 5 5 5 5 5
#include <iostream>
using namespace std;
int tong[100001];//准备桶排序
int main(){
int n,m,x,i;
cin>>n>>m;//输入n和m
for(i=1;i<=n;i++){
cin>>x;//输入学生答案
tong[x]++;//对应答案的数量++
}
for(i=0;i<=m;i++){
if(tong[i]>=(n/2+1)){//比较:如果数量超过一半,则输出这个答案,然后结束程序
cout<<i<<endl;
return 0;
}
}
cout<<"?"<<endl;//如果都没有数量超过一半的答案,输出“?”
return 0;
}