CUGBSTL
STL训练内容
C - Infinite Replacement
题目大意:给一个只包含字符a的字符串s,然后再给一个字符串t,对于s中的每一个字符a,都可以替换成t,替换后s变成s’,对s‘可以再次进行这种操作,问最多可以创造出多少不同的字符串?
解法:
1.如果t==“a”,那只可以构造出一个串,就是自己
2.如果t中包含字符a,那就可以无限构造,输出-1
3.如果t中不包含字符a,那s的每个a都可以替换成t,假设s的长度是n,替换0个a的方案数是\(C~n^0\),替换一个字符的方案数是\(C~n^1\)……
全加起来就是2^n。
F - Divisibility by 2^n
题目大意:给你一个长度为n的数组,对于每个元素a[i],都可以将其变化为a[i]*i,每个元素只可以变一次,代价为1,求一种方案使得新数组是否是2^n的倍数,不存在输出-1,存在的话求最小次数,输出最小次数
解法:
1.将每一个数分解成某个数和若干个2相乘的形式,将所有元素这样分解,可以求出原数组贡献出来的2的个数,计为cnt1,然后对每一个i进行同样的操作,记录出每一个i的贡献,放入一个vector中
2.情况1,若cnt1>=n,那就不需要任何操作,输出0
情况2,对vector进行排序,每次贪心的选取最大的,然后代价+1,cnt+=v[i],一旦cnt>=n就break,输出代价
3.如果vector的元素全都选了一边还不够,那就输出-1

浙公网安备 33010602011771号