题意:
t组输入,给出个n,代表接下来给出长为n的数组,你可以对数组中的任意的数采取加一操作任意次,问最少操作多少次该操作可以使其和不为零并且其积不为零。
题解:
直接计算其和和其零的数量,分别讨论它的四种情况,对每种情况讨论。(切忌直接计算其积,100的100次方会爆long long)
代码:
https://codeforces.com/contest/1300/submission/70707175
题意:
t组输入,给出一个n,代表下面给出长为2*n的数组。将这2*n个人分成两个班,每个班有奇数个人。怎么分配人能使两个班的中位数差最小。
题解:
首先有一点使肯定的想要最小,那两个班的中位数一定是2*n数组中的相邻的两个数,要构造出他们两个是两个班的中位数,他们必须要满足一个条件,结构:左边的数+中位数+右边的数,左边的数的数量=右边的数的数量,因此比中位数小的数的数量=比中位数大的数的数量,所以两个相邻的数一定位于中间。
代码:
https://codeforces.com/contest/1300/submission/70644473
题意:
f(x,y)=(x|y)-y。
给出一个n,代表下面给出一个长为n的数组,重新排序数组,使其f(f...f(a1,a2),a3),...an-1),an)最大。
题解:
遇到这种题,一般需要将其转换成只有一个运算符,根据f(x,y)的真值表,只有x=1,y=0的情况值才为1,其余均为0,不妨将其转换成x&(-y),其真值表是一致的,因此问题转化为使a1&(~a2)&(~a3)...&(~an)最大了,其真值为只有a1=1,其余皆为0才为1,其他情况都为0,所以,找到最大一位且只有一个数有这一位的一的数,将其放在第一位即可,f(f...f(a1,a2),a3),...an-1),an)的最大值为2的(只出现一次一的那一位的位数-1)次方。
代码:
https://codeforces.com/contest/1300/submission/70714186
上述代码中有bitset的知识,不懂的可以看我的文章有bitset的介绍:
https://www.jianshu.com/writer#/notebooks/42202619/notes/60304504