Problem A:
给你一片叶子的信息,从哪颗树上掉下的和颜色,然后问有几种不同的叶子
由于数据不大,用的暴力法比较法解决
tutorial里讲到一种比较好的方法就是把信息(字符串)进行排序,然后忽略相同的,这种方法在数据量大的时候效果应该会比较好
代码:
Problem B:
给你体积为0.5,1,2的三种瓶子,每种分别有a,b,c个,问用这些瓶子装体积为n的可乐可以有多少种方法
我的方法是DP,设cnt[i]为装体积i有多少种方法,由于0.5的存在,把体积都扩大2倍,若i=j+v(v=1,2,4),则cnt[i]+=cnt[j]
初始cnt[0]=1
代码:
Problem C:
题目意思抽象出来就是给若干个区间,每次把区间上的点覆盖一次,然后问你是否每个点都只被覆盖一次,若不是,输出第一个不满足条件的点和它被覆盖的次数,由于数据量很小,也就变成一道水题了
代码:
Problem E:
给你一长串字符,然后要你把它分成k行输出,每行至少输出a个字符,之多输出b个字符
注意到当l<k*a或者l>k*b时,是无解的
当有解时,k*a<=l<=k*b => a<=l/k<=b,设h=l/k,如果h为整数,每行输出h个,否则,令ret=l%k,ret<k,我们可以选择前ret行输出h+1个
代码:
Problem H:
给你玛莎的电话号码s,然后她随即选一个数字作为新号码t的首位,新号码的第i位这样得到:t[i]=(s[i]+t[i-1])/2,如果t[i]为小数,可以向上或向下取整,问一共可以得到多少种新号码(如果t==s,t不算新号码)
这道题我的方法是记忆化搜索,f[d][x]表示号码t的第d个数字是x的话有几种可能,号码s是不变的,一旦号码t的某一位确定了,它后面可能的情况数就不会变了
判断t是否会与s相等时,只要当i>=2时,s[i]都能由s[i]和s[i-1]得到就会出现相等的情况,一开始忽略了s[i]×2可能等于s[i]+s[i-1]-1的情况
代码: