hdu 1800 Flying to the Mars

Flying to the Mars
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22993 Accepted Submission(s): 7364

Problem Description
这里写图片描述

In the year 8888, the Earth is ruled by the PPF Empire . As the population growing , PPF needs to find more land for the newborns . Finally , PPF decides to attack Kscinow who ruling the Mars . Here the problem comes! How can the soldiers reach the Mars ? PPF convokes his soldiers and asks for their suggestions . “Rush … ” one soldier answers. “Shut up ! Do I have to remind you that there isn’t any road to the Mars from here!” PPF replies. “Fly !” another answers. PPF smiles :“Clever guy ! Although we haven’t got wings , I can buy some magic broomsticks from HARRY POTTER to help you .” Now , it’s time to learn to fly on a broomstick ! we assume that one soldier has one level number indicating his degree. The soldier who has a higher level could teach the lower , that is to say the former’s level > the latter’s . But the lower can’t teach the higher. One soldier can have only one teacher at most , certainly , having no teacher is also legal. Similarly one soldier can have only one student at most while having no student is also possible. Teacher can teach his student on the same broomstick .Certainly , all the soldier must have practiced on the broomstick before they fly to the Mars! Magic broomstick is expensive !So , can you help PPF to calculate the minimum number of the broomstick needed .
For example :
There are 5 soldiers (A B C D E)with level numbers : 2 4 5 6 4;
One method :
C could teach B; B could teach A; So , A B C are eligible to study on the same broomstick.
D could teach E;So D E are eligible to study on the same broomstick;
Using this method , we need 2 broomsticks.
Another method:
D could teach A; So A D are eligible to study on the same broomstick.
C could teach B; So B C are eligible to study on the same broomstick.
E with no teacher or student are eligible to study on one broomstick.
Using the method ,we need 3 broomsticks.
……

After checking up all possible method, we found that 2 is the minimum number of broomsticks needed.

Input
Input file contains multiple test cases.
In a test case,the first line contains a single positive number N indicating the number of soldiers.(0<=N<=3000)
Next N lines :There is only one nonnegative integer on each line , indicating the level number for each soldier.( less than 30 digits);

Output
For each case, output the minimum number of broomsticks on a single line.

Sample Input

4
10
20
30
04
5
2
3
4
3
4

Sample Output

1
2

Author
PPF@JLU

题目网址:(http://acm.hdu.edu.cn/showproblem.php?pid=1800)
翻译:
飞向火星
时间限制:5000/1000 MS(Java / Others)内存限制:32768/32768 K(Java / Others)
总提交:22993已接受提交(S):7364

问题描述

在8888年,地球由PPF帝国统治。随着人口的增长,PPF需要为新生儿找到更多的土地。最后,PPF决定攻击治理火星的Kscinow。问题出现了!士兵怎么能到达火星?PPF召集他的士兵并要求他们的建议。“Rush …”一名士兵回答。“闭嘴 !我必须提醒你,从这里开始没有任何通往火星的道路!“PPF回答。“飞!”另一个答案。PPF笑道:“聪明的家伙!虽然我们没有翅膀,但我可以从HARRY POTTER购买一些魔术扫帚来帮助你。“现在,该学习飞行扫帚的时间了!我们假设一名士兵有一个等级编号表示他的学位。高一级的士兵可以教低一级,也就是说前者的水平>后者的水平。但低级不能教高等级。一名士兵最多只能有一名教师,当然,没有教师也是合法的。同样,一名士兵最多只能有一名学生,而没有学生也是可以的。老师可以用同一把扫帚教他的学生。当然,所有的士兵在飞向火星之前一定是练过扫帚的!魔术扫帚价格昂贵!那么,你能帮助PPF计算所需扫帚杆的最小数量吗?
例如:
有5名士兵(ABCDE),级别编号为:2 4 5 6 4;
一种方法:
C可以教B; B可以教A; 所以,ABC有资格在同一把扫帚上学习。
D可以教E;所以DE有资格在同一把扫帚上学习;
使用这种方法,我们需要2把扫帚。
另一种方法:
D可以教A; 所以AD有资格学习同一把扫帚。
C可以教B; 所以BC有资格在同一把扫帚上学习。
E没有老师或学生有资格在一把扫帚上学习。
使用这种方法,我们需要3把扫帚。

在检查了所有可能的方法后,我们发现2是所需的最低数量的扫帚。

输入
输入文件包含多个测试用例。
在一个测试案例中,第一行包含一个表示士兵数量的正数N(0 <= N <= 3000)。
接下来的N行:每行只有一个非负整数,表示每个士兵的等级编号。(少于30位数字);

输出
对于每种情况,请在一行上输出最低数量的扫帚。
样例输入

4
10
20
30
04
5
2
3
4
3
4

样例输出

1
2

题意:
本题要求输入多组数据,每组数据先输入一个n,然后再输入n行,每行输入一个整数,本题等级高的可以教等级低的,每组数据要求输出需要扫帚的最少数量。
思路:
根据题意可以知道我们只用求出元素出现最多的那个元素出现的次数即可。
代码:

#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,s,i,j,d,x;
    vector<int> v;//定义int容器v
    while(cin>>n)
    {
        s=0;
        d=1;
        v.clear();//清空v
        for(i=0;i<n;i++)
        {
            scanf("%d",&x);//用cin会时间超限,输入的数据比较多
            v.push_back(x);//在v后面插入元素x
        }
        sort(v.begin(),v.end());//排序
        for(i=0;i<n-1;i++)
        {
            if(v[i]==v[i+1])//判断重复的每组的数据
            {
                d++;
            }
            else
            {
                if(d>s)
                    s=d;
                d=1;
            }
        }
        if(d>s)//这一步是判断最后一个数据的次数与s的大小
            s=d;
        cout<<s<<endl;
    }
    return 0;
}

用map写:

#include<map>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
    int n,s,i,j,d,x,q;
    while(~scanf("%d",&n))
    {
        s=0;
        map<int,int> v;
        for(i=0;i<n;i++)
        {
            scanf("%d",&x);
            if(!v[x])
                v[x]=1;
            else
                v[x]++;
        }
        map<int,int>::iterator it;
        for(it=v.begin();it!=v.end();it++)
        {
            if(s<it->second)
                s=it->second;
        }
        printf("%d\n",s);
    }
    return 0;
}

运行结果:
这里写图片描述

总结:
这个题因为输入的数据比较多,输入时最好用scanf别用cin,不然很容易时间超限,特别是输入的那n行整数。
杭电oj题目分类

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值