HDU 1800 Flying to the Mars

题意:
    在8888年,地球由PPF帝国统治。随着人口的增长,PPF需要为新生儿找到更多的土地。最后,PPF决定攻击治理火星的Kscinow。问题出现了!士兵怎么能到达火星? PPF召集他的士兵并要求他们的建议。 “Rush ......”一名士兵回答。 “闭嘴 !我必须提醒你,从这里没有任何通往火星的道路!“PPF回答。 “飞!”另一个答案。 PPF笑道:“聪明的家伙!虽然我们没有翅膀,但我可以从HARRY POTTER购买一些魔术扫帚来帮助你。“现在,该学习飞行扫帚的时间了!我们假设一名士兵有一个等级编号表示他的学位。高一级的士兵可以教低一级,也就是说前者的水平>后者的水平。但低级不能教高等级。一名士兵最多只能有一名教师,当然,没有教师也是合法的。同样,一名士兵最多只能有一名学生,而没有学生也是可以的。老师可以用同一把扫帚教他的学生。当然,所有的士兵在飞向火星之前一定是练过扫帚的!魔术扫帚价格昂贵!那么,你能帮助PPF计算所需扫帚杆的最小数量吗?
例如 :
有5名士兵(A B C D E),级别编号:2 4 5 6 4;
一种方法:
C可以教B; B可以教A;所以,A B C有资格在同一把扫帚上学习。
D可以教E;因此D E有资格在同一把扫帚上学习;
使用这种方法,我们需要2把扫帚。
另一种方法:
D可以教A;所以A D有资格在同一把扫帚上学习。
C可以教B;所以B C有资格在同一把扫帚上学习。
E没有老师或学生有资格在一把扫帚上学习。
使用这种方法,我们需要3把扫帚。
......
在检查了所有可能的方法之后,我们发现2是所需的最小数量的扫帚。
输入:输入文件包含多个测试用例。在一个测试案例中,第一行包含一个表示士兵人数的正数N(0 <= N <= 3000)接下来的N行:每行只有一个非负整数,表示每个士兵的等级编号(小于30位);
输出:对于每种情况,请在一行上输出最低数量的扫帚。
解题方法:map+贪心
解题思路:要使扫帚的数量最少,则应该让高等级的人教的人更多,贪心的思想油然而生。因为同一个等级的两个人不能被同一个人教,故需要统计每个等级的人出现的次数,出现的次数最多的人的次数即为最终答案。
注意事项:1.注意士兵的等级编号有30位......一开始了解错了,以为是等级数最多不超过30
                 2.题目中给出的数据有虚位,但其实不用考虑虚位(除非用char数组存)
                 3.map定义的时候两个数据类型最好都定义为long long(或_int64),定义为int可能会出问题(emmm......之前定义为int的时候输出不正确,改成long long就对了)
下面为代码: 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
	long long n,r;
	long long maxx;
	while(~scanf("%d",&n))
	{
		map <long long,long long> m;
		for(int i=0;i<n;i++)
		{
			scanf("%lld",&r);
			m[r]++;
		}
		maxx=0;
		map <long long,long long>::iterator ha;
		for(ha=m.begin();ha!=m.end();ha++)
		{
			if(ha->second>maxx)
			maxx=ha->second;
		}
		printf("%lld\n",maxx);
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值