田忌赛马续
题意 :自从齐王和诸公上次被田忌赢了许多的钱而不服,要求再比一次,为了不使田忌能向上一次一样赢得比赛,就规定这次赛马是N对N,就是齐王选出N匹马,田忌必须也出相应的N匹马进行比赛,田忌为了赢取更多的钱,便向孙膑请教赛马的胜负。(和田忌赛马的故事基本相同)
思路: 一开始我以为和田忌赛马的故事基本一致,我就只考虑了田忌最多可以赢多少场,写完过了样例,一交就WA了,然后我就发现了一个很严重的问题,田忌赢的多不代表田忌最后一定可以赢。所以就换了个想法,把田忌能够百分百获胜的情况列下来,如果不能百分百胜利,就考虑把输掉的最弱的马去抵消齐王的最强的马,以此来获得最终胜利。
代码实现:
#include
#include
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int tj[10005];
int qw[10005];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&tj[i]);
for(int i=0;i<n;i++)
scanf("%d",&qw[i]);
sort(tj,tj+n,cmp);
sort(qw,qw+n,cmp);
int wn;
wn = 0;
int a1,b1,a2,b2;
a1 = b1 = 0;
a2 = b2 = n-1;
for(int i=0;i<n;i++)
{
if(tj[a1]<qw[b1])//田忌的弱马比齐王的弱马强,直接赢
{
wn++;
a1++;
b1++;
}
else//田忌的弱马比齐王的弱马弱
if(tj[a2]<qw[b2])//田忌的强马比齐王的强,直接赢
{
wn++;
a2–;
b2–;
}
else
if(tj[a2]>qw[b2])
{
wn–;
a1++;
b2–;
}
else
{
if(tj[a1]>qw[b2])
{
wn–;
}
a1++;
b2–;
}
}
if(wn==0) printf("DRAW\n");
else if(wn>0) printf("WIN\n");
else printf("LOSE\n");
return 0;
}
- 题目链接 https://sdnuoj.rainng.com/problem/show/1026。