HDOJ 1800 Flying to the Mars
点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1800
题目意思:有n个士兵每个人有一个水平值,水平高的的人可以教低的人,意思就是求最少的扫帚,那么我们只要知道找到最大重复元素的次数即可,因为相同的人肯定不能共用一个,所以求得最少即为最大的重复次数
注意:前置的0必须要去掉,例如数据
3
0
00
000
输出 3
代码1(直接map):
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
//去掉前置的0
string Str(string str){
int mark , i;
string temp;
if(str.size() == 1)//如果长度为1直接返回
return str;
for(i = 0 ; i < str.size() ; i++){
if(str[i] != '0'){
mark = i;
break;
}
}
if(i == str.size())//如果 i为 长度说明都是0直接返回一个“0”
return "0";
else{
for(int i = mark ; i < str.size() ; i++)
temp += str[i];//用temp来存储去0后的字符串
return temp;
}
}
int main(){
int n , max , t;
string str , temp;
map<string , int>mp;
while(scanf("%d" , &n) != EOF){
max = 0;
for(int i = 0 ;i < n ; i++){
cin>>str;
temp = Str(str);
t = ++mp[temp];//注意这里用一个t来存储值,不然超时,map的键值用字符串会很慢
if(max < t)
max = t;
}
cout<<max<<endl;
mp.clear();//每次清除mp对象
}
return 0;
}