这道题的最优决策应该很好想出来,我们考虑想要减少数目那么让每只怪兽攻击哪只怪兽。根据题目描述,我们只有会攻击值比目前考虑的这只小的才会对答案产生影响。那么每次让每只怪兽攻击目前还存活的最小值一定是最优的。
先将数组排序,每次攻击攻击队首的元素即可,记录答案。
特殊性质r≤2会有30pts
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
int a[N];
int ans1;
int ans2;
int ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==1) ans1++;
if(a[i]==2) ans2++;
}
// cout<<ans1<<endl<<ans2<<endl;
ans=max(ans2,ans1);
cout<<ans<<endl;
return 0;
}
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int ans = 1;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
//从小到大排序
//最优解是存活的攻击防御值最小的
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) {
if (a[ans] >= a[i]) {
continue;
}
ans++;
}
cout << n - ans + 1;
return 0;
}