D - Wall Painting
题意:给你n个数,第i天(i属于[1,n])从n个数中选择i个数,进行异或。对于所有情况得到的数进行求和,即为第i天所得到的答案。输出从第1—n天的答案
思路:对于求和的题目,一般就是考虑求和的每一个数的特征,要么就是考虑相邻两个求和结果之间存在某些关系。因为这个题目强调每一个数的生成是通过异或方式,所以就顺理成章地把n个数写成二进制,观察这n个数与生成的加数与最后对应的和之间的关系。
4
1 2 10 1
以此为例,把这4个数写成如下的二进制
0 0 0 1
0 0 1 0
1 0 1 0
0 0 0 1
比如求第二天的答案,按照常规思路是先写出所有的加数,写过之后。让你继续写第三天,你会发现加数特别多,无从下手,但是你又可以发现这些加数又不是一定要算出来才能得出求和答案。什么意思呢?如果我们知道这些加数(写成二进制)的 某一个位上是否有1即可,因为0对答案没贡献。
所以,我们就把想求所有加数的值问题转化成对应二进制某一位上1的这些数有多少!
接下来,就很简单,二进制某一位对答案的贡献属于常规题
num[i]表示二进制从低到高第几位(最低位我默认为1)
Ans+=Cnum[i]k∗Cn−num[i]天数−k∗2i−1
AC代码
Ball
题意:给你 R个红球, Y个黄球 and B个蓝球,问按照题目规则,摆放后获得最大score为多少?
思路:
设a <= b <= c(a为min(R, Y, B), c 为 max(R, Y, B), b为中间值)
A表示a对应的颜***表示b对应的颜色 C表示c对应的颜色
我们观察第一个样例 2 2 2
A -> AB(+1) -> ABC(+2) -> AABC(+3) -> ABABC(+4) -> ABCABC(+5)
我们发现如果还有剩余的ABC,那么其对答案的贡献均是6(已达到贡献的最大值)
于是我猜测这道题目直接枚举即可
注意a <= b <= c
a = 0 b = 0 c = 0 ans = 0
a = 0 b = 0 c = 1 构造C ans = 0
a = 0 b = 0 c = 2 构造CC ans = 1
a = 0 b = 0 c = 3 构造CCC ans = 1 + 2
规律(1)
a = 0 b = 0 c = 0 ans = 0
a = 0 b = 0 c = 1 ans = 0
a = 0 b = 0 c >= 2 ans = 1 + (c - 2) * 2
a = 0 b = 1 c = 1 构造BC ans = 1
a = 0 b = 1 c = 2 构造CBC ans = 1 + 2
a = 0 b = 1 c = 3 构造CCBC ans = 1 + 2 + 3
a = 0 b = 1 c = 4 构造CCCBC ans = 1 + 2 + 3 + 3
规律(2)
a = 0 b = 1 c = 1 ans = 1
a = 0 b = 1 c >= 2 ans = 1 + 2 + (c - 2) * 3
a = 0 b = 2 c = 2 构造CBBC ans = 1 + 2 + 3
a = 0 b >= 2 c >=2 ans = 1 + 2 + 3 + (b + c - 4) * 4
规律(3)
a = 0 b >= 2 ans = 1 + 2 + 3 + (b + c - 4) * 4
a = 1 b = 1 c = 1 构造ABC 1 + 2
a = 1 b = 1 c = 2 构造CABC 1 + 2 + 3
a = 1 b = 1 c = 3 构造CACBC 1 + 2 + 3 + 4
规律(4)
a = 1 b = 1 c = 1 ans = 1 + 2
a = 1 b = 1 c >= 2 ans = 1 + 2 + 3 + 4=(c - 2) * 4
a = 1 b = 2 c = 2 构造BCABC 1 + 2 +3 + 4
a = 1 b = 2 c = 3 构造BCCABC 1 + 2 + 3 + 4 + 5
规律(5)
a = 1 b >= 2 c >= 2 ans = 1 + 2 + 3 + 4 + (b + c - 4) * 5
a >= 2 b >= 2 c >= 2通过第一个例子发现规律
规律(6)
ans = 1 + 2 + 3 + 4 + 5 + (a + b + c - 6) * 6)
暴力check即可
AC代码