田忌赛马,贪心,每次取最好的那种策略,这里坑点就是在田忌(下面用t)最快的马和王(下面用q)最快的马速度相等时候的最优情况。
首先我们确定t最快的马比q最快的马要慢的时候,这时候t注定要输一场,那么就用t最慢的马去输,这是最优情况。
其次我们确定t最快的马比q最快的马还要快的时候,我们就直接比,赢了完事,这是最优情况。
最后我们考虑t和q最快马速度相等的情况:
如果t最慢的马比q最慢的马要快,那我们先比最慢的,当前不考虑。
之后:q最快的马比t最慢的马要快,那么我们就拿最慢的比,因为在最慢比t慢的情况下,我们注定要输一场,那么就拿最慢的去输最快的,那么t留下的就是第二慢去比最慢的马。
之后:如果t最慢的马和q最快的马一样快(数据在扯淡感觉),那么我怎么比都是平局,最快马一样快,最慢马也和最快马一样快,注定这次平局。
结束。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1005;
int n,a[maxn],b[maxn];
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);
sort(b,b+n);
int cnt=0,sum=0;
int qm,tm,tk,qk;//m:最慢 k:最快
tm = qm = 0;
tk = qk = n-1;
while(cnt<n){
if(b[qk] > a[tk]){
sum -= 200;
tm++,qk--,cnt++;
continue;
}
if(b[qk]==a[tk]){
if(b[qm]<a[tm]){
qm++,tm++,cnt++,sum+=200;
continue;
}
if(b[qk]>a[tm]){
qk--,tm++,cnt++,sum-=200;
continue;
}else{
tm++,qk--,cnt++;
}
continue;
}
if(b[qk]<a[tk]){
qk--,tk--,cnt++,sum+=200;
continue;
}
}
printf("%d\n",sum);
}
return 0;
}