[CSP-S 2024] 决斗 AC满分代码

题目描述

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

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

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

输入格式

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

输入的第二行包含 nn 个正整数,其中第 ii 个正整数表示第 ii 个怪兽的攻击力及防御力 r_iri​。

输出格式

输出一行包含一个整数表示游戏结束时未退出游戏的怪兽数量的最小值。

输入输出样例

输入#1

5

1 2 3 1 2

输出 #1

2

输入 #2

10 

136 136 136 2417 136 136 2417 136 136  136

输出 #2 

8

说明/提示

【样例 1 解释】

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

【样例 3】

见选手目录下的 duel/duel3.in 与 duel/duel3.ans。

该样例满足  1 ≤ i ≤ n, ri ≤ 2 ∀ 1≤i≤n,ri​≤2。

【样例 4】

见选手目录下的 duel/duel4.in 与 duel/duel4.ans。

【数据范围】

对于所有测试数据,保证:1 ≤ n ≤ 10^51≤n≤105,1 ≤ r_i ≤ 10^51≤ri​≤105。

测试点nnr_iri​特殊性质
1\sim 41∼4 10≤1010^5≤105无特殊性质
5\sim 105∼1010^5≤1052≤2无特殊性质
11\sim 1511∼1530≤3010^5≤105特殊性质 A
16\sim 2016∼2010^5≤10510^5≤105无特殊性质

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

方法1:

   题目解析:

    //要解出每个怪兽卡最后剩余卡片数量, 而且每个怪兽都要攻击一次。 其实这道题我们讲过类型题。 主要是要能读懂题

    //样例: 1 2 3 1 2    
    //1 攻击 无怪兽死亡
    //2怪兽 可以打死一个, 
    //3怪兽打死一个2   3卡牌留下
    //1 攻击无怪兽死亡
    //最后一个2攻击一个怪兽2留下卡牌,  
    
    //同理举出多个样例
    //我们在举出其他样例  1 2 3 4 5 6 7 8  此时最后只能剩余一个8 
    //如果出现重复数据样例:
    //例1、  1 2 2 3  则最后剩余2个  2 3  
    //例2、  1 2 2 2 3 则最后剩余的是 2 2 3 因为3攻击的第一个3后不能在攻击,最后需要留下后面的两个2,
    //例3、  1 2 2 2 2 3 则最后剩余的是 2 2 2 3  
    //我们在用特殊情况重复数据案例
    //例1、  1 1 1 2 3 最后剩余 1 2 3 
    //例2、  2 2 3 4 4 4  最后剩余4 4 4 
    //由此多个样例中我们得出结论,也就是数字的重复数量最多的一个就是我们的结果
    //那么我们提取出最多重复数量的那个数就是我们的结果。
  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值