AtCoder Beginner Contest 288

原题连接:https://atcoder.jp/contests/abc288

A简单题
B字符串冒泡排序。注意strcpy strcmp函数的运用
C问删多少条边可以变成森林


ps:以下题解未经代码提交验证

D
有一串数,每次询问一个区间,问能否通过一定次数的操作(选定一个长度为K的区间,使其中每个元素加一个整数)将这个区间都变成0
操作可转化为对差分数组的操作,而目标则是差分数组d[l+1]~d[r]=0,d[l]=-a[l-1]
而能达成目标的充要条件是:(操作是可逆的)


E
大概的大意:有几样东西一定要买,但你可以通过购买其他物品来降低购买这几样物品的价格,问最小花费
具体题意见原题
考虑到几样物品一定要买,我们尝试依次考虑每个物品最便宜的情况,但发现可能存在购买更多其他物品,使得当前考虑的物品与后面要考虑的物品达到一个更低的总价,存在后效性
故加一个维度,用f[i][j]表示在考虑第i个物品,一共买了j个物品
a[i][j]表示前面已经买了j个物品的情况下,买i的最小价格
非必选:f[i][j]=min(f[i-1][j],f[i-1][j-1]+a[i][j])//不买当前,买当前
必选品:f[i][j]=f[i-1][j-1]+a[i][j];
复杂度O(n^2)
瞥了一眼别人代码,要注意long long

F
给定一个 n 位数 X,把 X 分成若干段,得分为每一段数字组成的数的乘积(可以不分割,得分为 X本身)。求所有分法得分之和,取模 998244353998244353。
ps:12:1×2+12=14
无论前面的数字如何,只要是完整的,那么12X+1×2 X可以分配为(12+1×2)X
那么对于已确定的右端点,可以枚举这一段数字的左端点,复杂度O(n^2)
考虑进一步优化,我们发现,假如当前数字c不是一串数的首位,而前面的一串数为X,则有X'=X*10+c
设f[i]为算到第i位的答案,且数X从第k+1位开始,c在第i位
则f[k]×X--->f[k]×(X×10+c)=f[i-1]×10+f[k]×c
则f[i]=f[i-1]×10+Σf[k]×c
复杂度优化到O(n)

参考内容:https://www.bilibili.com/video/BV1PR4y1z7kA

G
三进制下,如果x和y每一位的相差都不超过1,则说x和y是相邻的
每个数都可能有炸弹,现给出所有数相邻数的炸弹数,问炸弹在哪
题解貌似是容斥

posted @ 2023-02-08 15:53  从零开始sfcn  阅读(59)  评论(0编辑  收藏  举报