测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A30565. 决斗(duel)

填空题 较难
知识点

题目描述

决斗(duel)

题目描述

今天是小 Q 的生日,他得到了 n 张卡牌作为礼物。这些卡牌属于火爆的“决斗怪兽”,其中,第 i 张卡代表一只攻击力为 ri,防御力也为 ri 的怪兽。

一场游戏分为若干回合。每回合,小 Q 会选择某只怪兽 i 以及另一只怪兽 j(i ̸= j), 并让怪兽 i 向怪兽 j 发起攻击。此时,若怪兽 i 的攻击力小于等于怪兽 j 的防御力,则 无事发生;否则,怪兽 j 的防御被打破,怪兽 j 退出游戏不再参与到剩下的游戏中。一 只怪兽在整场游戏中至多只能发起一次攻击。当未退出游戏的怪兽都已发起过攻击时, 游戏结束。

小 Q 希望决定一组攻击顺序,使得在游戏结束时,未退出游戏的怪兽数量尽可能少。

输入格式

从文件 duel.in 中读入数据。

输入的第一行包含一个正整数 n,表示卡牌的个数。

输入的第二行包含 n 个正整数,其中第 i 个正整数表示第 i 个怪兽的攻击力及防御力 ri。 

输出格式

输出到文件 duel.out 中。 输出一行包含一个整数表示游戏结束时未退出游戏的怪兽数量的最小值。

样例 1 输入 

5

1 2 3 1 2

样例 1 输出 

2

样例 1 解释

其中一种最优方案为:第一回合让第 2 只怪兽向第 1 只怪兽发起攻击,第二回合 让第 5 只怪兽向第 4 只怪兽发起攻击,第三回合让第 3 只怪兽向第 5 只怪兽发起攻击。 此时没有退出游戏的怪兽都进行过攻击,游戏结束。可以证明没有更优的攻击顺序。

样例 2 输入 

10

136 136 136 2417 136 136 2417 136 136 136

样例 2 输出 

8

样例 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。

特殊性质 A:保证每个 ri 在可能的值域中独立均匀随机生成。

参考答案

#include <bits/stdc++.h> using namespace std; map<int,int> r; int n = 0, a = 0, ans = 0; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a; r[a]++; if (ans < r[a]) ans = r[a]; } cout << ans << endl; return 0; }

答案解析

方法二:

#include <bits/stdc++.h>

using namespace std;

int n, a[100001], num = 1;

int main() { 

cin >> n;

for (int i = 1;i <= n;i++)

cin>>a[i];

sort(a + 1, a + n + 1);

for (int i = 2;i <= n;i++) {

if (a[num] >= a[i]) continue;   

num++;

}

cout << n - num + 1;

return 0;

}

上一题 下一题