您的位置:首页 > 其它

贪心——田忌赛马(HDU1052)

2017-02-13 13:30 337 查看
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1052

题意:田忌和王各有n匹马,每匹马有一个速度值,他俩赛马,赢者得200分,输者减200分,求田忌最多能得到多少分

分析:贪心思路来想,我们先考虑完所有田忌能赢的情况,然后再用最小成本去输:

先判断田忌最好的马是否能赛过王最好的马

如若不行则考虑田忌最差的马是否能赛过王最好的马

若还是不行则用田忌最差的马去赛王最好的马输掉一局(平局不算)

AC代码:

/*************************************************************************
> File Name: 1052.cpp
> Author: Akira
> Mail: qaq.febr2.qaq@gmail.com
> Created Time: 2017年01月17日 星期二 20时49分05秒
************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
#include<vector>
#include<set>
#include<list>
#include<ctime>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) ((a)*(a))

using namespace std;

#define MaxN 100000
#define MaxM MaxN*10
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define bug cout << 88888888 << endl;
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)

int n;
int A[1005];
int B[1005];
bool cmp(int a, int b)
{
return a>b;
}
int main()
{
while(~scanf("%d", &n) && n)
{
for(int i=0;i<n;i++) scanf("%d", &A[i]);
for(int i=0;i<n;i++) scanf("%d", &B[i]);
sort(A,A+n,cmp);
sort(B,B+n,cmp);

int win = 0;

int Ts = 0,Qs = 0;
int Te = n-1,Qe = n-1;

while(n--)
{
if(A[Ts] > B[Qs])
{
Ts++;
Qs++;
win++;
}
else
{
if(A[Te] > B[Qe])
{
Te--;
Qe--;
win++;
}
else if(A[Te]<B[Qs])
{
Te--;
Qs++;
win--;
}
}
}
printf("%d\n", win*200);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: