CF #681 div.2 目前ABCD
A. Kids Seating
题意:1-4n输出n个数,使这n个数既不互质也不能整除
思路:4n是2的倍数,它的最大因数是2n,因此输出中间 n个递减2序列即可
代码:
int main()
{
t = read();
while (t--) {
n = read();
for (register int i = 1; i <= n; i++) {
write(4 * n - 2 * i);
printf(" ");
}
printf("\n");
}
return 0;
}
B. Saving the City
题意:对于给定 01字符串 ,消除所有1,其中
1.可以花费a消除相连的一片1
2.可以花费b使一个0变成1
思路: 简单线性动规dp[i],可以用last(上一个1的位置 )来约束。
代码:略
C. The Delivery Dilemma
题意:给定两个长度为n的数组a,b,任意选择一些下标i,对于已选择的下标i,得到 a i a_{i} ai中的最大值 a,对于未选择的下标i,得到其 b i b_{i} bi之和 b,最后,求min(a+b)
思路:按从大到小重排序数组a(数组b对应下标一起发生变化),然后前缀和预处理数组b,即可
代码: 略
D. Extreme Subtraction
题意:对于给定数组a,试问是否可通过以下两种操作(次数不限)使其变为全0数组。
1.前k项元素都减1
2.后k项元素都减1
思路:显然,满足条件的数组都是可以通过操作(或不用)变换为非严格递减(或非严格递增)序列。因此,处理任意一边,观察是否可以变换为非严格递X序列即可。
1.找到从左(右)端非严格递减序列的最后1个元素
2.然后通过该元素向另一端开始处理(保证从那端开始为非严格递减元素)
关键代码:
//找某端开始的非严格递减序列的最后1个元素
int L = 1, R = n;
int i = 2;
while (i <= n && a[i] <= a[L]) L = i++;
i = n - 1;
while (i >= L && a[i] <= a[R]) R = i--;
//处理,保证从L--R是非严格递减的(处理另一边同样可以)
bool flag = 1;
int dh = a[R]; a[R] = 0;
for (register int i = R - 1; i >= L; i--) {
if (a[i] < a[i + 1]) {
flag = 0; break;
}
else {
int t = a[i];
a[i] = max(a[i + 1], a[i] - dh); //保证递减
dh = t - a[i];
}
}
E. Long Permutation
题意:目前 test 4 TLE (到时手写全排列)
思路:
结尾
蒟蒻不定时补题,有生之年 ,主要是为了监督自己做题补题。
附一篇参考大佬题解(全),写的更详细:
https://blog.csdn.net/qq_40760407/article/details/109566198