题解但是双指针
2026-08-22 17:06:56
发布于:上海
13阅读
0回复
0点赞
原题链接:https://www.acgo.cn/problemset/info/36088?questionCollectionId=9792
先说思路,看完题面后就很容易得只需要先将数组排序,然后用两个指针i和j,分别代表需要击败的卡牌和当前发动攻击的卡牌,每轮判断r[j]是否大于r[i],如果是,就让i退出战场,i后移,顺带用ans统计退出的卡牌数,就可以了。
好久没见到这么简单的csp-s题了(如果想的到的话)
#include<bits/stdc++.h>//万能头
using namespace std;
int n,ans,a[100010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ans=n;//ans表示一场游戏结束后还在场上的卡牌数
sort(a+1,a+n+1);//按升序排序
for(int i=1,j=1;i<=n&&j<=n;j++){//i表示未被打败的卡牌,因为已经排序,所以会优先打败牌面小的卡牌,防止后面打不过
//j表示现在出击的卡牌,因为每张卡牌只能出击一次,所以只需判断当前牌面是否比要击败的卡牌牌面大就行
if(a[j]>a[i]){//如果当前牌面比要击败的卡牌大,则i指针后移,ans--,一张卡牌退出战场
i++;
ans--;
}
}
cout<<ans;
return 0;//不要漏写啊,不然考试真的会爆零的
}
给个赞行不行
这里空空如也







有帮助,赞一个