hdu.1800 Flying to the Mars - map初体验

本文介绍了一个有趣的算法问题,目标是最小化训练士兵飞行所需的魔法扫帚数量。通过分析士兵等级和教学规则,采用适当的数据结构解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

####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

###翻译:
####问题描述:
在8888年,地球由PPF帝国统治。随着人口的增长,PPF需要为新生儿寻找更多的土地。最后,PPF决定攻击统治火星的Kscinow。问题来了!士兵怎么能到达火星?PPF召唤他的士兵并询问他们的建议。“匆匆…”一名士兵回答。“闭嘴 !我是否必须提醒你,这里没有通往火星的道路!“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

####题意概括:
假设一名士兵有一个等级数字表示他的学位。具有较高等级的士兵可以教低级,但是较低的不能教更高。一名士兵最多只能有一名教师,当然,没有老师也是合法的。同样地,一名士兵最多只能有一名学生,而没有学生也是可能的。老师可以用同样的扫帚教他的学生。当然,所有的士兵都必须在扫帚上练习才能飞到火星上!
####分析:
1.只需要找到 士兵等级中数目最多的那个士兵数 该数目即为所求
2.可以用map,等级和该等级的士兵数一一对应即可。
####代码:
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
long long n,i,s,max;//因为等级数目很大,所以用 long long
while(scanf("%lld",&n)!=EOF)//接下来要输入的等级数目
{
map<int,int>m; //等级和该等级的士兵一一对应

        for(i=0;i<n;i++)
        {
            scanf("%lld",&s);//输入士兵等级
            if(!m[s])		//如果士兵等级之前没有出现  对应值为1
                m[s]=1;
            else m[s]++; //之前出现过,值+1
        }
         map<int,int>::iterator it =m.begin();
         max=0;
        for(it=m.begin();it!=m.end();it++)//找到等级数目最多的士兵数,即为所求
            if(it->second>max)
                max=it->second;
        printf("%lld\n",max);

  }
  return 0;
}

####运行结果:
这里写图片描述
####总结:
最开始想的时数组,可是等级数会很大就放弃这个思路,选择用map。选对思路很重要,事半功倍。

电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
HDU 2034 是一道经典的 A-B Problem 题目,通常涉及简单的数学运算或者字符串处理逻辑。以下是对此类问题的分析以及可能的解决方法。 ### HDU 2034 的题目概述 该题目要求计算两个数之间的差值 \(A - B\) 并输出结果。需要注意的是,输入数据可能存在多种情况,因此程序需要能够适应不同的边界条件和特殊情况[^1]。 #### 输入描述 - 多组测试数据。 - 每组测试数据包含两行,分别表示整数 \(A\) 和 \(B\)。 #### 输出描述 对于每组测试数据,输出一行表示 \(A - B\) 的结果。 --- ### 解决方案 此类问题的核心在于正确读取多组输入并执行减法操作。以下是实现此功能的一种常见方式: ```python while True: try: a = int(input()) b = int(input()) print(a - b) except EOFError: break ``` 上述代码片段通过循环不断接收输入直到遇到文件结束符 (EOF),适用于批量处理多组测试数据的情况。 --- ### 特殊考虑事项 尽管基本思路简单明了,在实际编码过程中仍需注意以下几点: 1. **大数值支持**:如果题目中的 \(A\) 或 \(B\) 可能非常大,则应选用可以容纳高精度的数据类型来存储这些变量。 2. **负数处理**:当 \(B>A\) 导致结果为负时,确保程序不会因符号错误而失效。 3. **异常捕获**:为了防止运行期间由于非法字符或其他意外状况引发崩溃,建议加入必要的错误检测机制。 --- ### 示例解释 假设给定如下样例输入: ``` 5 3 7 2 ``` 按照以上算法流程依次完成各步操作后得到的结果应当分别为 `2` 和 `5`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值