http://codeforces.com/contest/1195
A. Drinks Choosing
题目: n个人,k种饮料,第i个人想喝第a_i种饮料。提供任意饮料套餐,一个饮料套餐必定含有相同的两份饮料。取ceil(n/2)份饮料套餐,问最多有多少人能喝到自己想喝的饮料
对a数组排序后,统计有多少对(k,k)相同数字可以喝同一份套餐,记为cnt1,其余不能组成对的数字个数为n-cnt1*2,最后答案是cnt1*2+ceil((n-cnt1*2)/2)
B. Sport Mafia
题目:Alya做n次行动,每次行动要么往箱子里放糖果,要么吃掉箱子里1颗糖果。当放糖果时,第一次放一个,第二次放两个....,Alya做完n次行动后,最后箱子里剩k个糖果,问Alya吃了多少个糖果
设Alya放了x次糖果,吃了y颗糖果
x+y=n
x(x+1)/2-y=k
解方程即可
x = (-3+sqrt(9+8(n+k)))/2
y = n-x
C. Basketball Exercise
题目:有两行人,给出了他们的身高h1,1,h1,2,…,h1,n 和h2,1,h2,2,…,h2,n,现在要组成一个篮球队,使得身高总数最大,且满足在同一行的人不相邻
dp[i][0]表示第i列不选取任何人时的最大总和
dp[i][1]表示第i列选取第1行人时的最大总和
dp[i][2]表示第i列选取第2行人时的最大总和
dp[i][0]=max(dp[i-1][0],dp[i-1][1],dp[i-1][2])
dp[i][1]=max(dp[i-1][0],dp[i-1][2])+h1,i
dp[i][2]=max(dp[i-1][0],dp[i-1][1])+h2,i
D. Submarine in the Rybinsk Sea
题目:f函数会将他两个参数数字逐位交叉,例如
f(1111,2222)=12121212
f(7777,888)=7787878
f(33,44444)=4443434
f(555,6)=5556
f(111,2222)=2121212
给出n个数字,求他们两两进行f运算后的总和∑ni=1∑nj=1f(ai,aj) modulo 998244353.
D1题限制所有数字ai都有相同位数,也就是都是k位数。
对于一个数字,例如12345,它会被分拆为102030405和1020304050与其他数字组合,所以在最后求和时,提供了总量1122334455*n的总量。遍历每个数字ai,将f(ai,ai)*n加入总和即可
D2题去除了限制。
那么首先需要统计cnt[i]表示i位数的数字有多少个。cnt[i>k]表示大于k位的数字有多少个。
对于一个数字,例如12345,逐位分拆数字
考虑12345拆为1234和5时,与个位数结合时,提供123450*cnt[1]的总量以及123405*cnt[1]的总量。与其他数字结合,提供50*cnt[i>1]+5*cnt[i>1]的总量。
考虑1234拆为123和4时,与十位数结合,提供1234000*cnt[2]以及1230400*cnt[2]的总量。与其他数字结合提供400*cnt[i>2]+4000*cnt[i>2]的总量。
以此类推