题目链接:https://codeforc.es/contest/1159
A. A pile of stones
题目大意:给定一个区域,这个区域开始有多个石头存在(也有可能石头数为0),现在每次从这个区域拿去一个石头或者增加一个石头(“+”表示增加一个石头进来,“-”表示拿走一个石头),问最终该区域最少有多少个石头。
解题思路:因为所有的操作都是合法的。那么将一个人的所有操作存进一个字符串(只由“+”和“-”构成),设原先共有石头数为x,并假设x为0,那么在遍历字符串的时候遇到“+”则加1,遇到“-”则减1,同时x不可能为负数(当他变成复数的时候,我们可以将它归零),最终x为所求。
代码链接:点击查看代码
B. Expansion coefficient of the array
题目大意:给定一组序列,要求找到满足 这个等式的K
解题思路:将上述等式转换成 ,只要找到最小K就可以了。刚开始写了两层for循环进行暴力(时间复杂度O(N^2))找最小K,发现TLE了,只能进行优化,优化后时间复杂度O(N),具体实现是一层for循环遍历序列,将ai和a1以及ai和an进行处理,寻找最小K。
代码链接:点击查看代码
C. The Party and Sweets
题目大意:每个男生都会给每一个女生送糖果(可以送0颗,即不送),给定一组由n个数组成的序列b,bi表示第i个男生给某个女生送的糖果数是他送给其他女生中的最少颗,再给定一组由m个数组成的序列g,gi表示第i个女生被某个男生送的糖果数是她被其他男生送的中最多的数目。现在已知这两组序列,求至少一共有多少颗糖果。
解题思路:由题可建立n*m的二维数组的模型,现在需要做的就是,求这个二维数组所有元素的最小和
- 序列g中最小数一定不小于序列b中的最大数,否则无解
- 序列g的所有元素和为sg,序列b的所有元素和为sb,并且序列g和b都按照从小到大排序,那么最终可通过以下公式计算出结果
注:这里的sb*m+sg构建的是(n+1)*m的二维数组的所有元素和,现在需要从这个二维数组中去掉m个元素(序列b中的元素),其中b[n-1]*(m-1)相当于去掉m-1个元素,那么最终需要判定b[n-1]==g[0]?,当等式成立,表示b[n-1]可由g[0]代替表示,此时去掉b[n-1],否则的话,b[n-1]无法有其他元素替代,则去掉b[n-2]这个元素。
代码链接:点击查看代码
D. The minimal unique substring
题目大意:两个字符串s和t,字符串t是字符串s的唯一的最短子串,例如,s="10101",那么t="010",因为如果t="1"或者"0"时,t在s中作为子串的位置不唯一,当t="10"或者t="01"时,也是在字符串s中的位置不唯一;当t="1010"或“0101”或“10101”时,虽然此时t在字符串s中的位置唯一,但是他们的长度都比“010”长。所以现在已知字符串s和字符串t的长度,需要你求出一条满足上述条件的字符串s(答案不唯一)
解题思路:首先我们先观察三个串 1010,110110,11101110,答案都是红色部分,我们可以下一个结论,形如 abab ( a 中有非负整数个 1 , b 中只有一个 0 )这类的字符串答案恒为 2 ,也就是 k==2 ,然后就是用这类字符串去构造出我们所需的 k 。我们可以尝试从末尾加一个1,那么之前的串变成了 10101,1101101,111011101,那么答案为红色部分。我们可以发现,通过我们末尾添加的1,导致之前红色部分的 01 与我们末尾添加的1与前面一个0构成的 01 重复,使得之前的红色部分向后挪一位。于是,我们可以用这一规律去构造出我们想要的k,显然答案就是末尾部分的01(蓝色部分111...10111...10111)满足 0 的个数加 1 的个数等于 k-1 ,那么对中间的影响(绿色部分111...1011111...110111)往后挪一位也就是我们的答案 k ,最后就是算出这形如 abab 字符串 a 部分中的 1 的个数有多少就行了,设 x 为 a 中 1 的个数,方程为 2*x+1+k-1=n ,化简为 x=(n-k)/2 ,根据题意 n 与 k 同奇偶,那么 x 也是唯一确定的,最后构造也由此生成。
这个题目卡了两天,实在没有思路,查看大佬的博客才最终将题目A掉,解题思路内容摘自DD_BOND的博客 Codeforces 1159D The minimal unique substring(构造)
代码链接:点击查看代码
E. Permutation recovery