hdu-1052(贪心)

链接

[https://vjudge.net/contest/261555#problem/I]

题意

就是两个人都有n匹马,每只马都有战力
第二个人出马的顺序是战力大到小,请问第一个人采取怎样的策略使得自己总的胜场尽可能多

分析

肯定先对二者的战力分别排序
然后就是想尽可能地把第一个人的每只马发挥最大的作用
如果该马不能打败对方的任何一只马就让它尽可能地把对方最强战力的马,搞定
虽然输了但后面也会有更大的可能多赢
所以就从战力最弱的马相比较

  1. 如果当前的我最弱的马大于对方最弱的马就直接比掉
    得一分,
    2
    如果当前的我最弱的马小于对方最弱的马
    用弱马比掉对方最强的马,丢一分,但为后面创造了更大的概率赢
  2. 如果当前相等
    先比较当前双方最强的马
    如果我们大于对方直接比掉,以防后面被别人用
    因为这样的必胜是一定先下手,而且对我们后面没影响。
    否则。
    就拿弱马比掉对方最强的马,丢一分,但为后面创造了更大的概率赢

    代码

#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<algorithm>
using namespace std;
#define ll long long
const int N=1e3+10;
int a[N],b[N];
int main(){
    int n;
    //freopen("in.txt","r",stdin);
    while(cin>>n&&n){
        for(int i=1;i<=n;i++)
        cin>>a[i];
        for(int j=1;j<=n;j++)
        cin>>b[j];
        sort(a+1,a+n+1);
        sort(b+1,b+n+1);
        int c1=0,c2=0;
        int u1=1,d1=n,u2=1,d2=n;
        while(u1<=d1&&u2<=d2){
            if(a[u1]>b[u2]){
                c1++,u1++,u2++;
            }
            else if(a[u1]<b[u2]){
                c2++;
                u1++;
                d2--;
            }
            else if(a[u1]==b[u2]){
                if(a[d1]>b[d2]){
                    c1++;
                    d1--,d2--;
                }
                else{
                    if(a[u1]<b[d2])
                    c2++;
                    u1++,d2--;
                }
            }
        }
        cout<<(c1-c2)*200<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/mch5201314/p/10645240.html