做了两天全国赛的题,今天终于做了一套相对水一点的题目。
北京市选的三道题,应该难度是倒序的。
第一题:给出几种面值的硬币,问要凑成某个面额,最少需要多少硬币。这题在1000000范围内的显然可以暴力DP f[i]=min(f[i],f[i-a[j]]+1)来处理,这个F数组在i非常大的时候,它一定会用最大的那个a[i]来更新,这个数组会变得趋于稳定,有个类似循环节的东西(如下图),于是题解就是小于1000000的暴力处理,大于1000000的用1000000以内的数+若干的a[i]来更新即可
这题在考试的时候我没有想到预处理,想O(nt)的方法想了两个半小时,进坑了。。导致后面比较简单的第三题没有时间写了.
第二题很明显是道数学题。已知 phi(y)=x,已知x,求最小的y.
这道题在考试的时候就比较有想法,也写了90分。假如y=p1c1(p1的c1次方)*p2c2*...pncn (p为y的质因子)
那么x=(p1-1)p1c1-1*(p2-1)p2c2-1*...*(pn-1)pncn-1;
我的思路是处理x的约数,把+1后等于质数的约数处理出来,和质因子一起。然后进行搜索即可 .
第三题是最水题,可惜到12点我才来做,只想到了60分的做法。
N=5000,2s时限。可以用O(N2)的方法过。
类似之前做过的一道叫好元素的题。开数组记录两个数的和为i的方案和一个数为i的方案有多少种。然后ans[i]=hashtwo(a[i]-a[j])+hashone(a[i]-2*a[j])+1(如果有3*a[j]==a[i])则加。这样每个三元组都被算了3次,把ans/3即是答案
教训:
1.注意分配时间,不要在一道题上花过多时间,以致其他题没有时间做。
2.分析题目的难度,由难到易做。