• CF257B 【Playing Cubes】


    题目翻译:

    (n) 个红方块和 (m) 个蓝方块 ((n,m le 10^5)),现在(A)(B) 两个人轮流搭方块 ((A) 先手 ()),如果上下两个方块颜色相同,则 (A) 得一分,否则 (B) 得一分。问 (A) , (B) 的最大可能得分分别是多少。

    思路:

    很显然:
    对于 (A),放与上次相同颜色的方块一定更优。
    对于 (B),放与上次不同颜色的方块一定更优。

    综合上述结论,我们开始分析。

    对于 (A),一直到选了 (min(n,m) imes 2) 个方块时,每次 (A) 都只有自己的放置能得一分,所以此时 (A) 的得分为 (min(n,m))
    在这之后,由于只剩下一种颜色,所以不论谁放都是 (A) 得分,所以此时 (A) 的得分为
    (min(n,m) + ((n+m)-min(n,m) imes 2))
    化简后就是 (max(n,m))
    又因为 (A) 是先手,所以首次放置一定不得分,所以还要减一,即 (max(n,m) -1)

    对于 (B),由于最多也就 (min(n,m)) 种不同颜色的可能,而且只要每次放与上次不同的颜色,这所有的可能都一定会出现,所以 (B) 的最大的分就是 (min(n,m))

    综上所述:
    对于 (A),答案为 (max(n,m) -1)
    对于 (B),答案为 $min(n,m) $。

    Code:

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    #include<bitset>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    
    using namespace std;
    
    int read()
    {
    	int ans=0,f=1;
    	char c=getchar();
    	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    	while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
    	return ans*f;
    }
    
    int n,m; 
    
    int main()
    {
    	n=read();m=read();
    	printf("%d %d",max(n,m)-1,min(n,m));
        //分析了那么久,核心代码就这一行
    	return 0;
    }
    
  • 相关阅读:
    Python中if __name__ == '__main__' 的作用和原理
    ajax请求参数为中文乱码的情况
    表单提交---前端页面模拟表单提交(form)
    mysql中函数DISTINCT,group by,CONCAT及GROUP_CONCAT的使用
    Java的反射机制及应用实例
    Java中的IO学习总结
    Form表单提交
    Java中equals和==的区别
    Java的String&StringBuffer&StringBuilder
    Java的Date类与Calendar类
  • 原文地址:https://www.cnblogs.com/blackbird137/p/13550368.html
Copyright © 2020-2023  润新知