您的位置:首页 > 其它

HDU1052-Tian Ji -- The Horse Racing-贪心

2017-05-23 11:40 323 查看
https://vjudge.net/problem/HDU-1052

贪心的策略是很好理解的。

一开始没有理解。以为只要让最大的和最小的颠倒就好了。。

其实关键就是 找最小的来凑数。

当田鸡最快的马大于 齐王时,比较

慢于齐王时,用最慢的来代替。

如果相等时,看最慢的马

如果田慢大于齐慢,直接赢

否则,就让他去代替。

(不用管太多,唯一需要注意的就是相等的情况,所以还要判断一下他和齐快的大小。。万一相等了呢)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
/*这道题是贪心的好题。开始以为直接排序就可以,
再换一下 首尾的顺序。
后来才发现不是。
4 3 2 1
1 4 3 2如果4干不过3但可以干过2,还是应该调整一下的。。
如果 田鸡最快的快,那么直接比较
如果慢,用最慢的上。
如果相等,看最慢的,如果田鸡最慢的有优势,直接比较
如果没有,就让慢的上
(注意一下是否比最大的慢,判断次数防止相等的情况)

*/
const int maxn=2000;
int main()
{   int t;
int a[maxn];
int b[maxn];
while(~scanf("%d",&t))
{  if(t==0) break;
for(int i=0;i<t;i++)
scanf("%d",&b[i]);
for(int i=0;i<t;i++)
scanf("%d",&a[i]);
sort(a,a+t);
sort(b,b+t);
int max1=t-1;
int max2=t-1;
int min1=0;
int min2=0;
int win=0;
while(min1<=max1&&min2<=max2)
{  if(b[max1]>a[max2])
{  win++;
max1--;
max2--;
//printf("!%d %d\n",max1+1,max2+1);
//continue;
}
else if(b[max1]<a[max2])
{   win--;
min1++;
max2--;
//printf("%d %d\n",max1-1,max2+1);
//田鸡最慢对阵大王最快的
}
else
{  if(b[min1]>a[min2])
{   win++;
min1++;
min2++;
//printf("@%d %d\n",min1-1,min1-1);
}
else
{  if(b[min1]<a[max2])
win--;
min1++;
max2--;
}
}

}
printf("%d\n",win*200);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: