这一场菜到扣脚.jpg
膜爆HYX大佬.gif
A:唐纳德先生与领土扩张
待补
B:唐纳德先生与网络降级计划
待补
C:唐纳德先生与这真的是签到题吗
很明显是一道构造题……
假设原序列为不递减的序列b[1],b[2]……,b[n],给出的序列为a[1],a[2],……,a[n*(n-1)/2]。
那么显然,a[1]=b[1]+b[2],a[2]=b[1]+b[3],而b[2]+b[3]就在他们后面的某一个中,并且一定在前n个里,因为和能小于b[2]+b[3]的组合显然只能是形如b[1]+b[x]这样子的。
因此,只要枚举之后哪一个是b[2]+b[3],就能确定下来b[1]=(a[1]+a[2]-a[x])/2,b[2]=a[1]-b[1],b[3]=a[2]-b[1]。
对于每一个目前未知的数,他的第一次加入一定是形如b[1]+b[x]的形式,因此,只要将目前已知的数的尚未出现过的组合记录下来,如果题目给出的序列的下一个是这些组合中的一个,就将记录减去一,否则就认为遇到了一个新的数字,将其记录后把他和b[2]开始的其他数字的组合加入记录。记录的方式可以采用multiset或者map来简单的实现。如果途中发现已经凑齐n个数字但还是出现了不存在于组合中的数,就说明这个解不合法,就可以继续考虑下一个b[2]+b[3]了。
效率方面,枚举b[2]+b[3]是O(n)的,由于每一个组合只会被加入和减去一次,所以用multiset判断是否可行的效率是O(nlogn),总效率为,在n为300的这题可以低空滑过。
D:唐纳德先生与 .DOC
表面上看是一道字符串难题,实际上认真考虑就会发现,只要交换中包含D、O、C就一定是不合法的,所以可行的交换实际上就只有两个都是点的情况……所以只要扫一遍就OK了。
E:唐纳德先生与假骰子
表面上看是一道概率论难题,实际上……只要把每一个概率乘以结果,得到的结果比较一下大小,无脑梭哈最大的就OK了,因为如果你分配一些概率给别的,得到的期望显然不如将这些概率分配给最大的结果。所以只要求一下和然后除一下就好了。注意这题要开long long,我就这么WA了两次……QAQ