A - Middle of the Contest
这没什么好说的了吧......

B - Preparation for International Women's Day
这题有必要说一下。首先对于两个数a,b,若要它们的和可以整除k,则有以下两种情况: * 1.a%k == 0且b%k == 0 * 2.(a%k+b%k)%k == 0

做法是,首先用一个arr数组把输入的所有数%k的结果存起来,数组里面存的是余数所出现的次数。对于第一种情况,只需要用arr[0]去处理。而对于0以外的余数,则将arr[i]和arr[k-i]进行比较。若arr[i]!=arr[k-i],则ans+=min(arr[i],arr[k-i]);若arr[i]==arr[k-i],则ans+=arr[i](或者ans+=arr[k-i])。还需要考虑一种情况,如果i==k-i,则ans+=arr[i]。另外,还需要注意,如果arr[i]==arr[k-i]与i==k-i同时成立,很明显应该ans+=arr[i]。

代码如下:

C - Balanced Team

先排个序,然后对于学生i,二分找出第一个比a[i]+5大的数的下标,然后以此维护最大值

代码如下:

D - Zero Quantity Maximization

用map记录每一个d出现的次数,然后再找出value值最大的d。要注意的是,当a==0&&b==0时,d一定存在且为任意实数,故ans++;当a==0&&b!=0时,无解,直接跳过。昨晚TLE了好几发居然是因为数组开小了OTZ

代码如下:

E - K Balanced Teams

C题的升级版。一开始是用的贪心,然后就wa了......正确方法是dp,但我不会OTZ......遂看题解

首先当然是排个序

然后,状态转移方程是这个👇

dp[i][j]=max(dp[i-1][j],dp[pos-1][j-1]+i-pos+1)

dp[i][j]指的是前i个人组成j个队伍最多可以挑选多少人;pos是i左侧第一个满足 arr[i]-arr[pos]的点的下标。

代码如下: