给出田忌和齐王各马的速度,求最优得分;
我的贪心策略(当然是错的 :
1,用我方在 可以 战胜 或 比平 对方最慢的马 的马 中 最慢的马 去比 对方最慢的马
2,直到我方最快的马也下场了,剩下的马默认全部战败
这种策略明显是不对的——我方的快马的贪心策略应该是击败能力范围内对方最快的马(浪费最小),我方的慢马的贪心策略应该是(在不能发挥其他作用的情况下)去恶心掉对方最快的马(额外获益最大)
结合这两种策略,总贪心策略应该是:
1.用我方最快马比对方最快马,如能获胜,则胜之(不能有更好的结果了)
2,如果1中不能战胜,则用我方最慢马抵之(一定会损失,让损失最小化)
3.如果1中可以比平,若我方最慢马可以战胜对方的最慢马,则让他战胜而不抵(还能发挥更大作用,否则用其他马去比那匹慢马损失更大)直到找到最没用的慢马,把对方最快马给恶心掉
需要指出的是,我方最慢马比对方最快马是可能平局的,要判断这种情况#include<cstdio>
#include<algorithm>
using namespace std;
int a[1500],b[1500];
int main(){
int n;
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 ans=0,j1=0,j2=n-1,i1=0; // j1 我方慢马 j2我方快马 i1敌方慢马 i敌方快马
for(int i=n-1 ; i>=i1 ; i--){
// printf("%d %d
",a[j2],b[i]);
if(a[j2]>b[i]){ans++; j2--;} //策略1
else if(a[j2]<b[i]){ans--; j1++;} //策略2
else {
if(a[j1]>b[i1]){ans++; i1++; j1++; i++;} //策略 3-1
else {if(a[j1]<b[i])ans--; j1++;} // 策略 3-2 ,注意平局的判断
}
}
printf("%d
",ans*200);
}
return 0;
}