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

posted @ 2023-01-11 22:54  给我一首zuo的时间  阅读(27)  评论(0)    收藏  举报