田忌赛马小故事:
齐国使者到大梁来,孙膑以刑徒的身份秘密拜见,用言辞打动齐国使者。齐国使者觉得此人不同凡响,就偷偷地用车把他载回齐国。齐国将军田忌赏识他并像对待客人一样礼待他。田忌经常与齐国诸公子赛马,设重金赌注。孙膑发现他们的马脚力都差不多,可分为上、中、下三等。于是孙膑对田忌说:“您只管下大赌注,我能让您取胜。”
田忌相信并答应了他,与齐王和诸公子用千金来赌胜。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,拿您的上等马对付他们的中等马,拿您的中等马对付他们的下等马。”三场比赛完后,田忌一场不胜而两场胜,最终赢得齐王的千金赌注。于是田忌把孙膑推荐给齐威王。威王向他请教兵法后,就把他当作老师。
题目:
自从齐王和诸公上次被田忌赢了许多的钱而不服,要求再比一次,为了不使田忌能向上一次一样赢得比赛,就规定这次赛马是N对N,就是齐王选出N匹马,田忌必须也出相应的N匹马进行比赛,田忌为了赢取更多的钱,便向孙膑请教赛马的胜负。
输入:
第一行有一个整数N(0<N<10000), 紧跟N行,每行一个整数,田忌的每匹马跑完全程需要的时间t(0<t<20000) 再紧跟N行,每行一个整数,齐王的每匹马跑完全程需要的时间t(0<t<20000)
输出:
如果田忌能赢则输出“WIN”
如果田忌能输则输出“LOSE”
如果比赛平局则输出“DRAW”
思路:由题目我们很容易想到会将田忌与齐工的马进行排序(注意耗时越长越弱)。这样的目的是按照孙膑的思路去分清上中下马,因为太多了,我们可以认为排完序的马为强弱马。但是我们在进行分类讨论的过程中,需要注意一个问题,我能不能只按照强马的强弱去比较?实际上是不能的
举个例子: 每人假设有6匹马
田忌:8 7 6 5 2 1
齐公:9 8 5 4 3 2
结果会出现这两种情况,原因就是,如果只看强马比较,我们会忽略掉弱马的作用!!
和原赛马不同,由于原赛马只有3只马,所以分为了下中上三种马,从而使得容易分辨区间。其实他想告诉我们的是,每只马在自己的区间内,也是有自己的作用的,就算是弱马,你也可以干爆别的马从而获得积分!(蒟蒻泪目
因此,我们可以结束这题了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define PII pair<int, int>
#define PLL pair<ll, ll>
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
const double eps = 1e-8;
int a[N],b[N];
bool cmp(int x,int y)
{
return x > y;
}
void solve()
{
int n;
cin >> n;
for(int i = 0; i < n; i ++) cin >> a[i];
for(int i = 0; i < n; i ++) cin >> b[i];
sort(a,a+n,cmp);//把弱到强的🐎排序
sort(b,b+n,cmp);
int win = 0;
int a1 = 0, b1 = 0;
int a2 = n - 1, b2 = n - 1;
for(int i = 0; i < n; i ++)
{
if(a[a2] < b[b2]) //如果田忌强🐎打的过齐公,田忌就赢了一分
++ win;
-- a2;
-- b2;
}
else if(a[a1] < b[b1])//如果田忌弱🐎打的过齐公,田忌就赢了一分
{
++ win;
++ a1;
++ b1;
}
else if(a[a2] > b[b2])//如果田忌强🐎打不过齐公,拿田忌最弱的🐎换齐公
{
-- win;
--b2;
++a1;
}
else if(a[a2] == b[b2] && a[a1] > b[b2])//两个人的强🐎一样nb,并且田忌的弱马更弱,拿田忌最弱的🐎换齐公
{
--win;
--b2;
++a1;
}
}
// cout<<win<<endl;
if(win == 0) puts("DRAW");
else if(win > 0) puts("WIN");
else if(win < 0)puts("LOSE");
}
int main()
{
solve();
return 0;
}