稍垃圾。因为T1没A。
赶巧前一段时间学了杜教筛,结果因为教练放错题。
然后考场上疯狂yy,最后水到了一个AC。
其实的确挺不公平的,不少人也没学呢。
如果只算T1和T3的分数的话,那70分就是个垃圾。
还有。。。。
又一次盖掉自己70分。。。
想剪枝结果打错了。
在没有用堆跑Dijk时因为队列里的元素无序所以一个点可能被扩展多次,而有时候后扩展的状态更优,所以不能打标记continue。
其余其实还好,发挥的凑和吧。其实能yy出T2还是挺不容易的。
但是当然在正经考试里不会出现你学过别人没学过的知识点,所以不必窃喜。。。
T1:666
最优决策的形式一定是复制并连粘几遍,再删除几次,循环。
也就是用n的费用×n,用1的费用-1。
跑最短路,因为边权不大所以没必要开堆。
打表发现,乘的形式只有2357是有效的,所以只有5种转移。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int dp[1000001],q[10000005]; 6 #define maxn 1000000 7 int main(){ 8 memset(dp,30,sizeof dp); 9 dp[1]=0;q[1]=1; 10 for(int h=1,t=1;h<=t;++h){ 11 int a=q[h]; 12 if(a*2<=maxn&&dp[a*2]>dp[a]+2)dp[a*2]=dp[a]+2,q[++t]=a*2; 13 if(a*3<=maxn&&dp[a*3]>dp[a]+3)dp[a*3]=dp[a]+3,q[++t]=a*3; 14 if(a*5<=maxn&&dp[a*5]>dp[a]+5)dp[a*5]=dp[a]+5,q[++t]=a*5; 15 if(a*7<=maxn&&dp[a*7]>dp[a]+7)dp[a*7]=dp[a]+7,q[++t]=a*7; 16 if(a&&dp[a-1]>dp[a]+1)dp[a-1]=dp[a]+1,q[++t]=a-1; 17 } 18 int n;scanf("%d",&n);printf("%d\n",dp[n]); 19 }