标签:算法 贪心 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