本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-03-30 14:04:20
题意
就是田忌赛马,赢一场比赛得+200银元,输了得-200银元,平局不加不减,求田忌最多能得到几个银元。
思路
这个题很显然是贪心,我们主要思想就是$以小换大$。 将齐王最快的马用我们最慢的马去换掉,这是最好的。
如果田忌最快的马比齐王最快的马快,就直接去比;
如果田忌最慢的马比齐王最慢的马快,也直接去比;
如果田忌最快的马比齐王最快的马慢,就用田忌最慢的马去比;
如果田忌最慢的马比齐王最慢的马慢,就和齐王最快的马去比;
我们可以用类似指针的方法做,$la$ 是田忌最慢的马的下标,$lb$ 是齐王最慢的马的下标,$ra$ 是田忌最快的马的下标,$rb$ ,是齐王最快的马的下标。
当然,我们必须在前面sort一下,从小到大排一遍序。
代码
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N=1e3+5;
int a[N],b[N];
signed main(){
int n;
while(cin>>n){
if(n==0) return 0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int j=1;j<=n;j++) cin>>b[j];
sort(a+1,a+1+n);
sort(b+1,b+1+n);
int la,lb,ra,rb;
la=lb=1;\/\/最慢的马
ra=rb=n;\/\/最快的马
int res=0;
for(int i=1;i<=n;i++){
if(a[ra]>b[rb]){
res+=200;
ra--;
rb--;
}
else if(a[ra]<b[rb]){
res-=200;
la++;
rb--;
}
else if(a[la]>b[lb]){
res+=200;
la++;
lb++;
}
else{
if(a[la]<b[rb]){
res-=200;
la++;
rb--;
}
}
}
cout<<res<<endl;
}
}
这道题居然只有一个测试点!!


鲁ICP备2025150228号