题目大意:田忌和齐王赛马,各有N匹马,速度不同,赢了得200分,输了扣200分,问田忌最后赛马能得到的最高分是多少
输入:N
田忌第i匹马的速度(共N个,空格间隔)
齐王第i匹马的速度(共N个,空格间隔)
输出:最高得分
分析:贪心法。主要原则:尽可能的消耗齐王的快马,消耗自己的慢马。也就是说能赢尽量赢,赢不了就让田忌的最慢马去消耗齐王的最快马,同时判断一下这种消耗是平局还是输局就行了。
三条原则:1.田忌最快的马>齐王最快的马,直接比,赢了(消耗了齐王最快的马)
2.田忌最快的马<齐王最快的马,让田忌最慢的马去和齐王最快的马比,反正都会输,消耗了自己的慢马干掉了齐王的快马,很划算
3.田忌最快的马=齐王最快的马,此时需要比较一下田忌和齐王的最慢马
(1)田忌最慢的马>齐王最慢的马,直接比,结果是一平一胜,获得最大收益
(2)田忌最慢的马<=齐王最慢的马,让田忌最慢的马去和齐王最快的马比,消耗获益最大,最坏就是一胜一负,得分归0,和第2条原则可以归在一起写代码
代码:转载自https://blog.csdn.net/hatsune__miku/article/details/37923751
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[1200],b[1200];
bool vis[1200];
int main(){
int n;
while (~scanf("%d",&n),n){
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
sort(a+1,a+1+n);
sort(b+1,b+1+n);
memset(vis,false,sizeof(vis));
int ans=0,cnt=0; //ans是田忌赢的次数,cnt是田忌输的次数
int l=1,r=n; //田忌的最慢和最快马
int k=1,i=n; //齐王的最慢和最快马
while (k<=i&&l<=r){
if (a[r]>b[i]) { //田忌最快的马>齐王最快的马 胜
ans++;
r--;i--;
}
else {
if (a[l]>b[k]){ //田忌最慢的马>齐王最慢的马 胜
l++;k++;
ans++;
}
else { //自己的慢马去消耗齐王的快马
if (a[l]<b[i]){ //自己的慢马比齐王的快马慢 输
cnt++;l++;i--;
}
else { //自己的慢马和齐王的快马一样快 平
l++;i--;
}
}
}
}
printf("%d\n",(ans-cnt)*200);
}
return 0;
}