题解
查看原帖
题解
723989
zhangjizhi楼主2024/10/26 21:57

题面

概述:有nn张卡片,每张卡片有一个数值rir_i。每回合用一张卡片ii去攻击另一张卡片jj。如果ri>rjr_i>r_j,则卡片jj退出。每张卡片最多发起一次进攻,求若干回合后未退出卡片的数量最小。

#include<bits/stdc++.h>
using namespace std;
int n,a[100001],b[100001],ma;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[a[i]]++;
	}
	for(int i=1;i<=100000;i++)
	{
		ma=max(ma,b[i]);
	}
	cout<<ma;
	return 0;

思路:当有三只怪物战力分别为112233时,最优方案为22113322

所以,得出结论:第kk大战力要打第k1k-1大战力。

此时有两种情况:

  1. kk大战力的怪物数(xx)大于等于第k1k-1大战力的怪物数(yy)。

此时攻击完后有xx只第kk大战力的怪物。

  1. kk大战力的怪物数(xx)小于第k-1大战力的怪物数(yy)。

此时攻击完后有xx只第kk大战力的怪物和yxy-x只第k1k-1大战力的怪物,共yy只。

由于第k1k-1大战力的怪物比第kk大战力的怪物战力小,则一定比k+t(t>=1)k+t(t>=1)大战力的怪物战力小。

综上所述,攻击完一轮后共有max(x,y)max(x,y)只战力小于等于第kk大战力的怪物。

一直往后推,得答案最小为max(shu1,shu2,......,shu100000)max(shu_1,shu_2,......,shu_{100000})shuishu_i表示战力为ii的怪物数)。

测试记录

2024/10/26 21:57
加载中...