题意:

t组输入,给出n个火柴数,求用火柴能筹成的最大数为多少。

题解:

依照题目给出的图,可以看出0=6,1=2,2=5,3=5,4=4,5=5,6=6,7=3,8=7,9=6,并且想要数最大,明显是先要求位数最大再要求各个位上的数字最大,因此先判断n为奇偶,为奇数则先输出个7,后面再用1补全,若为偶数,则全用1补全。

代码:

https://codeforces.com/contest/1295/submission/69737724


题意:

题目中给出一个字符串的大小定义为它的0的个数减去1的个数。

t组输入,给出n和x,代表接下来给出一个长度为n的字符串s,要求s可以无限叠加,也就是多个s顺序相连(s+...+s+s的前缀),求有多少个组合它的大小为x。

题解:

先分析出s的前缀分别代表的大小,用数组a[]存,这是做出这道题的基础,对a[n]进行分类,若为0则代表它有无限个组合的可能,若在它的前缀数组中能凑出x则代表它能有无限个组合,否则根本凑不出,输出0。a[n]不为0则需要从另一个角度想问题,x若能被凑出是如何被凑出的呢?x=多个a[n]+a[i],一定是这样被凑出的,所以x-a[i]=多个a[n],然后判断(x-a[i])能否被a[n]整除,用模运算即可,有个小点需要注意的是用模运算需要小心(x-a[i])和a[n]必须同号。最后,还有一个小点,x为0的时候答案要加一,因为空字符串也算前缀。

代码:

https://codeforces.com/contest/1295/submission/69812775



题意:

t组输入,给出s和t字符串,问最少能用多少个s的子序列凑出t,不能凑出则输出-1。

题解:

最初的想法自然是暴力解决,记录各个字母第一次首次出现在s的位置,t中要找某个字母时从那个位置出发,找到尾,但很明显时间复杂度超了。不如换一种想法,同样是记录,只不过是记录s中所有字母出现的位置,将它们存成数组,用二维vector存,若t中要找某个字母时,用upper_bound找大于(上个字母在s中的位置)的首位置,若返回end()代表没找到,ans++,同时跟新上个字母在s中的位置为-1,若找到记得更新下新的位置。这样的时间复杂度为lent*log(lens)。

代码:

https://codeforces.com/contest/1295/submission/69880479