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


    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655
    简单博弈问题,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
    ");
    		else printf("Quber CC
    ");
    	}
    }
    
  • 相关阅读:
    Sublime Text 3 破解 + 注册 + 汉化 + 教程 + 快捷键大全 + 中文乱码 +编译JAVA
    cocos2dx 翻牌效果
    php中将SimpleXMLElement Object转化为普通数组
    VS2013+lua5.3.1 环境配置
    Jquery相册 fancybox-1.3.4
    JS~字符串长度判断,超出进行自动截取(支持中文)
    JS /jquery 时间戳与日期转换
    php验证身份证号码正确性
    JS身份证验证
    逆向编程一,PE结构拉伸内存
  • 原文地址:https://www.cnblogs.com/ucprer/p/11345280.html
Copyright © 2020-2023  润新知