贪心思路:田忌要用最小的代价(最慢的马)输一场比赛,而要耗费掉齐王最大的资源;齐王用最大的代价赢田忌,以最大的代价输田忌。
先把田忌和国王的马排序。
每次取田忌的最快的马与国王最快的马比较,有三种情况。
一,田忌最快的马比国王最快的快,那么直接拿田忌最快的马去赢国王最快的马。
二,田忌最快的马比国王最快的慢,那么拿田忌最慢的马去输国王最快的马。
三,田忌最快的马与国王最快的马速度一样。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define NUM 1005
int k[NUM],t[NUM];
int main()
{
int n,i,j,kn,win;//i:己方最小,j:对方最小;两头往中间遍历
while(cin>>n&&n!=0){
for(i=0;i<n;i++)
cin>>t[i];
for(i=0;i<n;++i)
cin>>k[i];
sort(k,k+n);
sort(t,t+n);
win=0;kn=n;//n:己方最大,kn:对方最大
for(i=0,j=0;i<n;){
if(t[i]<k[j]){//无平局,且己方最小<对方最小
i++;//拿最小拼对方最大
kn--;
win--;
} else if(t[i]>k[j]){//无平局,且己方最小>对方最小
i++;//直接赢
j++;
win++;
} else {//己方最小=对方最小
if(t[n-1]>k[kn-1]){//己方最大>对方最大
n--;kn--;//直接赢
win++;
} else if(t[n-1]<k[kn-1]){//己方最大<=对方最大
i++;kn--;//拿最小拼对方最大
win--;
} else if(t[n-1]==k[kn-1]){//最小与最大都与对方相等
if(t[i]<k[kn-1])//拿最小拼对方最大
win--;
i++;kn--;//己方最小=对方最大,则平局:指针往前移,win不变
}
}
}
cout<<win*200<<endl;
}
return 0;
}