田忌赛马(贪心

给出田忌和齐王各马的速度,求最优得分;

我的贪心策略(当然是错的 :

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; }
原文地址:https://www.cnblogs.com/-ifrush/p/10532647.html