真題模擬2022CSP-J總結

xxsap發表於2024-07-15

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)

相關文章