题目描述
今天是小 Q 的生日,他得到了 n 张卡牌作为礼物。这些卡牌属于火爆的“决斗怪兽”,其中,第 i 张卡代表一只攻击力为 ri,防御力也为 ri 的怪兽。
一场游戏分为若干回合。每回合,小 Q 会选择某只怪兽 i 以及另一只怪兽 j(i
j),并让怪兽 i 向怪兽 j 发起攻击。此时,若怪兽 i 的攻击力小于等于怪兽 j 的防御力,则无事发生;否则,怪兽 j 的防御被打破,怪兽 j 退出游戏不再参与到剩下的游戏中。一只怪兽在整场游戏中至多只能发起一次攻击。当未退出游戏的怪兽都已发起过攻击时,游戏结束。
小 Q 希望决定一组攻击顺序,使得在游戏结束时,未退出游戏的怪兽数量尽可能少。
输入格式
输入的第一行包含一个正整数 n,表示卡牌的个数。
输入的第二行包含 n 个正整数,其中第 i 个正整数表示第 i 个怪兽的攻击力及防御力 ri。
输出格式
输出一行包含一个整数表示游戏结束时未退出游戏的怪兽数量的最小值。
输入输出样例
输入 #1复制
5 1 2 3 1 2输出
2输入
10 136 136 136 2417 136 136 2417 136 136 136输出
8说明/提示
【样例 1 解释】
其中一种最优方案为:第一回合让第 2 只怪兽向第 1 只怪兽发起攻击,第二回合让第 5 只怪兽向第 4 只怪兽发起攻击,第三回合让第 3 只怪兽向第 5 只怪兽发起攻击。此时没有退出游戏的怪兽都进行过攻击,游戏结束。可以证明没有更优的攻击顺序。
【样例 3】
见选手目录下的 duel/duel3.in 与 duel/duel3.ans。
该样例满足 ∀1≤i≤n,ri≤2。
【样例 4】
见选手目录下的 duel/duel4.in 与 duel/duel4.ans。
【数据范围】
对于所有测试数据,保证:1≤n≤105,1≤ri≤105。
测试点 n ri 特殊性质 1∼4 ≤10 ≤105 无特殊性质 5∼10 ≤105 ≤2 11∼15 ≤30 ≤105 特殊性质 A 16∼20 ≤105 无特殊性质 特殊性质 A:保证每个 ri 在可能的值域中独立均匀随机生成。
通过题目可以了解到
- 怪兽 i 向怪兽 j 发起攻击。此时,若怪兽 i 的攻击力小于等于怪兽 j 的防御力,则无事发生;否则,怪兽 j 的防御被打破,怪兽 j 退出游戏不再参与到剩下的游戏中。
- 一只怪兽在整场游戏中至多只能发起一次攻击。当未退出游戏的怪兽都已发起过攻击时,游戏结束。
- i
j
结合样例得到每只怪兽只能发起一次攻击,也只能被攻击一次
因为i不等于j
所以可以得到i去攻击j,必定会有一个会被淘汰
举个例子:1 2 3 4 5
1攻击2,2攻击3,3攻击4,4攻击5;
得到的结果是1
到这里偶然想到了map,统计了一下出现最多攻击力(防御力)的次数,后来答对了
因为两两攻击,如果都不相同的话,最后剩下一个怪兽,每当多一攻击力(防御力)相同的怪兽,会导致两个相同的不能攻击,所以会多一个怪兽
大概思路就是这样,可能有些地方表述不是很严谨(通过代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
map<int,int> a;
for(int i=0;i<n;i++)
{
int b;
cin>>b;
a[b]++;
}
int max=0;
for(const auto&pair : a)
{
if(pair.second>=max)
{
max = pair.second;
}
}
cout<<max;
return 0;
}
850

被折叠的 条评论
为什么被折叠?



