真题模拟2022CSP-J总结
T1 乘方
这个题真的是很简单,就特判一下1的情况,其它情况直接暴力枚举即可
考试的时候也是非常快的想到
T2 解密
也比较容易
首先我们把ed = (p_i−1)(q_i−1)+1打开
变为ed = pq−p−q+1+1
将n = pq带入原式得:
ed = n−p−q+2
那么我们现在有了两个式子:
p+q = n-ed+2
pq = n
如果我们知道p-q那么问题就解决了
通过完平可得(a-b)^2 = (a+b)^2-4ab
这要只要去平方就能求出a-b
这道题有一些思维难度,但感觉直接一直向下分析就能算出来,在打模拟的时候也是挺顺利的写出了这道题,拿到了满分
T3 逻辑表达式
感觉是四道中最难的一道,也是唯一没AC的,没时间了,只打了5分(呜呜呜)
看到了一篇写的特别好的题解才有了思路,算是一道模拟题
大概思路如下:
首先,我们先想清楚在什么情况下一段表达式没有贡献
1.如果是 0& ,则在下一次出现 | 或和它前面一个括号之后会产生贡献。
2.如果是 1| ,则出现和它前面一个括号之后会产生贡献。
然后我们可以发现它的优先级并不会影响结果因为如果出现了因为如果出现 1|,则会一直调到后面的括号,所以它的优先级一定高于&,如果是0|,那它并不会对结果产生影响,&同理
T4 上升点列
是一道还算明显的dp
设f[i][j]为枚举到第i个点,我们还剩余j个添加自由点的机会,此时满足题意的点的最大长度。
那么f[i][j] = max(f[k][j+need]+need+1)
在这里 1 <= k <= i-1, need = abs(x[i]-x[k])+abs(y[i]-y[k])+1
最终答案
int ans = 0;
for (int i = 1;i <= n;i++)
{
for (int j = 0;j <= k;j++)
{
ans = max(ans,j+f[i][j]);
}
}
cout << ans << endl;
这样时间按复杂度未O(n^2k)