内容概述 本篇有两题 第二题为第一题的进阶,个人感觉题很不错 1.题目传送门 大致思路 选取100个数组内的数 k ($1≦k≦10$) 可以明确的是n足够大(可选够多)时肯定可以选出来,接下来讨论怎么解决 n 比较小的时候 我们可以用一个桶记录这些数出现的次数 cnt 十的倍数我们可以转化为 末位数字为 0 的数字 ,那么怎么转化为背包问题? 选100个数(容量) ,这些数字的末位数字就为价值 记dp[s][r],s为当前选了多少数,r表示能取到的末位数字. 遍历每一个数字(1-10) 对应末位数字为 0-9 ,做一个背包问题 $$dp[s+t][newr]=dp[s][ol
题目传送门 大致思路 不难发现,每一行取数的结果都是相互独立的,故可以对每行单独处理,将每行的结果进行累加得出答案 那么如何计算每行答案? 记dp[i][j],表示区间[i,j]的分数结果,则状态转移方程为 $$dp[i][j]=max(dp[i+1][j]+val,dp[i][j-1]+val) $$val为取对应数能获得的分数,我们可以预处理一个2的幂数组,快速得出答案 注意答案可能很大,我们用__int128类型计算 Code 1234567891011121314151617181920212223242526272829303132333435363738394041
题目传送门 并查集板题 Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#include <bits/stdc++.h>using namespace std;#define int long long#define lll __int128#define Mio_qh signed#define el '\n&
题目传送门 蒟蒻的第一篇博客 大致思路 记x右边添加了k个0,那么就有: $$y=10^k*x $$$$n=x+y=x*(10^k+1) $$又有$11≤n≤10^{18}$,于是可以枚举$10^k$,最多枚举18次 当n能被$10^k+1$整除时 答案就是 $n/(10^k+1)$,最后排序一下输出即可 Code 123456789101112131415161718192021void solve() { int n; cin>>n; int power=1; vector<int>