标签:算法 贪心 nyoj
3 92 83 71 95 87 74 2 20 20 20 20 2 20 19 22 18
200 0 0
题意:就是田忌赛马的故事,不过这次比赛的马不再是3只了,而变成了很多只,如果田忌输了就要给别人200块,赢了就拿200块,平局就算了。问田忌最多能拿多少钱。
思路:考虑这道题的话,就是一道标准的贪心,如何实现呢? 我们这样考虑;
1、我们先比较能力最大的,如果T(田忌)的马能力强,那就继续从强的这边比较。
2、不然就开始比较弱马,如果T弱马能力更弱或者等于K的弱马,就让这只马和K的强马比赛,田忌故意输一局。
AC代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int win,los,t[1010],k[1010];
int n;
void cmp(){
win=0;
los=0;
int l1=0,l2=0,r1=n-1,r2=n-1;
while(l1!=r1+1){//如果直接在l1==r1的时候就跳出了循环,就会少比较一个。
if(t[r1]>k[r2]){
win++;
r1--;
r2--;
continue;//加这个是让他一次只比较一个。也可以让他一直比较然后在左右两侧相等时跳出。
}
if(t[r1]<=k[r2]){
if(t[l1]>k[l2]){
win++;
l1++;
l2++;
continue;//与上面的同理。
}
if(t[l1]<=k[l2]){
if(t[l1]<k[r2])
los++;
if(t[l1]>k[r2])
win++;
l1++;
r2--;
}
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
int i;
for(i=0;i<n;i++)
scanf("%d",&t[i]);
for(i=0;i<n;i++)
scanf("%d",&k[i]);
sort(t,t+n);
sort(k,k+n);
cmp();
int ans=(win-los)*200;
printf("%d\n",ans);
}
return 0;
} 版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:算法 贪心 nyoj
原文地址:http://blog.csdn.net/gui951753/article/details/47704211