题面
概述:有n张卡片,每张卡片有一个数值ri。每回合用一张卡片i去攻击另一张卡片j。如果ri>rj,则卡片j退出。每张卡片最多发起一次进攻,求若干回合后未退出卡片的数量最小。
#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;
思路:当有三只怪物战力分别为1,2,3时,最优方案为2打1,3打2。
所以,得出结论:第k大战力要打第k−1大战力。
此时有两种情况:
- 第k大战力的怪物数(x)大于等于第k−1大战力的怪物数(y)。
此时攻击完后有x只第k大战力的怪物。
- 第k大战力的怪物数(x)小于第k-1大战力的怪物数(y)。
此时攻击完后有x只第k大战力的怪物和y−x只第k−1大战力的怪物,共y只。
由于第k−1大战力的怪物比第k大战力的怪物战力小,则一定比k+t(t>=1)大战力的怪物战力小。
综上所述,攻击完一轮后共有max(x,y)只战力小于等于第k大战力的怪物。
一直往后推,得答案最小为max(shu1,shu2,......,shu100000)(shui表示战力为i的怪物数)。
测试记录