地狱送之术http://poj.org/problem?id=2287
坑比,没事题目里瞎写啥?二分图什么鬼?用二分图写到泪奔有木有,居然还没写出来~~~~
这道题用贪心比较方便
首先是两个比较简单的规则
1.kfast的马快于tfast的马,自然用最慢的马吃掉最快的马。
2.kfast的马慢于tfast的马,那就更好说了,直接胜利
3.kfast如果等于tfast呢?这就有学问了
直接打平吗?
来看看这个数据
4
1 2 3 4
1 2 3 4
用这个策略明显收获0金,但是不妨试试4-1.1-2.2-3.3-4的方式,会收获400
如果直接tlow吃掉kfast
那么又有数据了
2
2 5
1 5
于是收获0
但是如果2-1,5-5
收获200~~
好纠结,我在想但是孙膑想了这么多吗!!!
看完吐槽估计大家基本能看到第三条的分类了
1.当tlow>klow,对结果有正的贡献,那么就不要让它吃掉kfast,而是去吃klow,来保证输出最大化
2.当tlow<klow,对结果仍是负贡献,果断吃kfast
3.当tlow=klow时,这个还是要有个小坑的。受先肯定是吃kfast,但这里有个问题,对结果的贡献是什么???
如果果断负贡献就要出问题了,来看数据
1
1
1
答案是什么
按照这个策略
-200
是不是很神奇!!!
刚输出这个的时候我也觉得好神奇
computer是sx的意思吗?
是的
不废话了,显然要分情况
1.tlow=kfast
这种不要有负贡献,应该是0贡献
2.tlow<kfast
果断负贡献
于是就有了
下面这个代码
话说我写的居然超时了!!!模仿某大神写的,终于过了~~
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<stack>
#include<queue>
#include<fstream>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<functional>
#include<cmath>
using namespace std;
#define maxn 1005;
#define inf 0x3f3f3f3f;
int khours[1005];
int thours[1005];
int tfast,kfast,tlow,klow;
int win,lost,num;
int main()
{
while(cin>>num&&num!=0)
{
win=0;
lost=0;
for(int i=0;i<num;i++)
{
cin>>thours[i];
}
for(int i=0;i<num;i++)
{
cin>>khours[i];
}
sort(khours,khours+num);
sort(thours,thours+num);
kfast=tfast=num-1;
klow=tlow=0;
for(int i=0;i<num;i++)
{
if(thours[tfast]>khours[kfast])
{
win++;
kfast--;
tfast--;
}
else
if(thours[tfast]<khours[kfast])
{
lost++;
tlow++;
kfast--;
}
else
if(thours[tfast]==khours[kfast])
{
if(thours[tlow]<khours[klow])
{
tlow++;
kfast--;
lost++;
}
if(thours[tlow]>khours[klow])
{
tlow++;
klow++;
win++;
}
if(thours[tlow]==khours[klow])//解决一下最后比较的两个数相等的情况比如数据1,1,1
{
if(thours[tlow]<khours[kfast])
{
tlow++;
kfast--;
lost++;
}
}
}
if(tfast<tlow)
break;
}
cout<<200*(win-lost)<<endl;
}
return 0;
}
ending,今天看到了昂神的照片,么么哒