Codeforces Round #574 (Div. 2)前五题

​​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]的总量。

以此类推

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值