码迷,mamicode.com
首页 > 其他好文 > 详细

HDU6655 Just Repeat(2019杭电多校J题)

时间:2019-08-13 13:20:12      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:+=   algo   相加   ==   node   问题   uniq   选择   str   

简单博弈问题,A,B手里各有n,m张牌,牌有颜色,两人轮流出牌(A先出),一个人只能打出对放未打出过的颜色的牌(可以打出自己打出过的颜色的牌),当一方不能再打出牌时,对方获胜。

博弈策略:优先选择双方都有该颜色的牌(对方没有的颜色和自己没有的颜色放在最后,不影响),再优先选择双方牌数相加最大的颜色的牌。

存储方法:读入之后离散化,统计数量,放入结构体数组,最后排序

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int a[maxn],b[maxn];
int aa[maxn],bb[maxn];
int ab[maxn];
struct node{
    int an,bn;
}c[maxn];
bool cmp(node a,node b){
    if(a.an==0||a.bn==0) return 0;//一方没有的放后面 
    if(b.an==0||b.bn==0) return 1;
    return a.an+a.bn>b.an+b.bn;
}
unsigned long long k1, k2,mod;
unsigned long long rng() {
    unsigned long long k3 = k1, k4 = k2;
    k1 = k4;
    k3 ^= k3 << 23;
    k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);
    return k2 + k4;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,m,p;
        scanf("%d%d%d",&n,&m,&p);
        for(int i=0;i<=n+m;i++) c[i].an=c[i].bn=0;
        if(p==1){
            for(int i=1;i<=n;i++) scanf("%d",&a[i]);
            for(int i=1;i<=m;i++) scanf("%d",&b[i]);
        }
        if(p==2){
            scanf("%lld%lld%lld",&k1,&k2,&mod);
            for (int i = 1; i <=n; ++i)
                a[i] = rng() % mod;
            scanf("%lld%lld%lld",&k1,&k2,&mod);
            for (int i = 1; i <=m; ++i)
                b[i] = rng() % mod;
        }
        for(int i=1;i<=n;i++) ab[i]=a[i];
        for(int i=n+1;i<=n+m;i++) ab[i]=b[i-n];
        sort(ab+1,ab+1+n+m);
        int size=unique(ab+1,ab+1+n+m)-(ab+1);
        for(int i=1;i<=n;i++) aa[i]=lower_bound(ab+1,ab+1+size,a[i])-(ab+1);
        for(int i=1;i<=m;i++) bb[i]=lower_bound(ab+1,ab+1+size,b[i])-(ab+1);
        for(int i=1;i<=n;i++) c[aa[i]].an++;;
        for(int i=1;i<=m;i++) c[bb[i]].bn++;
        sort(c,c+size,cmp);//c[0]也有值
        int suma=0,sumb=0;
        for(int i=0;i<size;i++){
            if(c[i].an && c[i].bn){
                if(i&1)
                    sumb+=c[i].bn;
                else suma+=c[i].an;
            }
            else{
                suma+=c[i].an;
                sumb+=c[i].bn;
            }
        }
        if(suma>sumb)printf("Cuber QQ\n");
        else printf("Quber CC\n");
    }
}

HDU6655 Just Repeat(2019杭电多校J题)

标签:+=   algo   相加   ==   node   问题   uniq   选择   str   

原文地址:https://www.cnblogs.com/ucprer/p/11345280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!