Confused 2019 BUPT校賽題解

2021-09-19 12:23:45 字數 4203 閱讀 3386

由於oj上還沒有題沒法測試,不保證**準確,但是演算法思想肯定是對的,等可以交的話通過後這句會刪掉。

其他的題以後補。

題目大意為給定a,b。需要判定是否存在一組數l , r,使得區間內有 a 個奇數 b 個偶數。範圍為1e18

是個水題。

很明顯奇數偶數最多差乙個,否則不是連續的。所以當a,b相差小於1 時輸出yes,否則為no

需要注意a,b同為 0 時輸出no,並且測試樣例較多需要用scanf或者開輸入輸出掛

//水

#include.h>

using namespace std;

typedef long long ll;

#define ti

() \

int t

; \

cin >>

t; \

while(t

--)int main()

else

}return0;

}

題目大意為bob想通過一條有n扇門的路,每經過一扇門需要一把鑰匙,購買一把鑰匙花費為1,門的種類不同也需要不同種鑰匙,他可以在任何時間購買任一種鑰匙,但最多攜帶k種鑰匙。

開始考慮分段,即從當前往後考慮k種門,經過這k道門的花費為k-xx為此時擁有的鑰匙中,和之後k種門種類相同的個數,即若當前擁有鑰匙,後k種為,則只需丟掉鑰匙1,購買鑰匙4即可,答案為3-2=1

然後就wa到自閉。

最後快結束的時候ljg想到乙個樣例為, k=3,發現這樣跑下來答案為7,但是有更優答案為6。

所以這演算法是假的!!!

之後換了貪心的思路(也是官方題解),每次需要買鑰匙的時候,丟掉距離當前位置最遠使用的鑰匙就可以了,比如上面樣例在擁有鑰匙時碰到門4,判斷出下一次用1是最遠的,則丟掉1;擁有碰到門5,判斷出4之後不再使用(距離記為inf)丟掉4。

注意記錄的下標總體最多1e5,但需要動態儲存否則會超記憶體。

// 思維+佇列

//**寫好了補

//input/*3

6 21 2 3 1 3 4

10 3

1 2 3 5 1 3 2 4 2 1

5 31 2 3 4 5 3 2 1

*///output/*4

66*/

題目大意為判定輸入構成的字串是否合法,合法條件為:wa不能相連且ac至少出現一次

初見開始在想數字dp(因為前幾天一直在看),後來發現是乙個簡單的遞推;

狀態 a1[i],c1[i],w1[i] 分別表示以 a,c,w 結尾長度為i且不存在wa的字串的個數

狀態 a2[i],c2[i],w2[i] 分別表示以 a,c,w 結尾長度為i且不存在wa和ac的字串的個數

初始狀態:

a1[1]=c1[1]=w1[1]=a2[1]=c2[1]=w2[1]=1;
轉移公式為:

a1[i]=	a1[i-1]+c1[i-1]	;

c1[i]= a1[i-1]+c1[i-1]+w[i-1];

w1[i]= a1[i-1]+c1[i-1]+w[i-1];

a2[i]= a2[i-1]+c2[i-1] ;

c2[i]= c2[i-1]+w2[i-1];

w2[i]= a2[i-1]+c2[i-1]+w2[i-1];

答案為長度為n,不存在wa且存在ac的狀態數。

二者相減即可:

ans=a1[n]+c1[n]+w1[n]-(a2[n]+c2[n]+w2[n]);
o(n)跑一遍取模輸出就可以了。

注意實現的時候不需要建6個陣列來存,只需要12個變數重複賦值即可。

//遞推

#include .h>

using namespace std;

typedef long long ll;

;const int mod =

(1e9+7

);int main()

//迴圈使用節省記憶體;

cout <<

((a + c + w)

% mod -

(a1 + c1 + w1)

% mod + mod)

% mod << endl;

}return0;

}//input

/*10

100*/

//output

/*11869

807464439

*/

題目大意為有一堆糖果,每個糖果有乙個快樂值,小明想可以進行三步操作:

1.將乙個糖果的值變為[-100,100]任意和原值不同的值;

2.將所有糖果按順序放,規則為每次只能放到最上或者最下;

3.計算總值,規則為奇加偶減;

按順序給定初始值,求結果最大為多少。

樣例1:1 2則將1變為-100 , 2 放在第一位,答案為2-(-100)=102

分析

1.每次放到最上最下,那麼每兩個數必定有乙個在奇數字乙個在偶數字。設兩個值為a,b,對這兩個數來說,擺放結果最大為|a-b|;

2.考慮改變a的值:a在奇數字,改變後結果為100-b;a在偶數字,結果為100+b;則無論a在何處,最大結果為100+|b|,所以對某一對來說,改變a的收益為100+|b|-|a-b|,所以需要改變這一對中絕對值小的那個值。要使收益最大化,需要將每一對按照收益排序,選擇最合適的進行改變。

所以建立結構體儲存值(|a|<=|b|),輸入時累加,編cmp函式用sort排序,或者標記一下最大收益的對,最後加上收益就是答案了。

需要注意,如果每一對都是的情況,因為要變成不同的,最後答案需要-1;

複雜度是o(n)級別的。

官方題解坐太后排沒看清,但是說複雜度o(n^3)推測應該是dp 。

//貪心+思維

#include .h>

using namespace std;

struct pro p[55]

;bool cmp

(pro a

, pro b

)int main()

p[i]

.mabs =

abs(p[i]

.a - p[i]

.b);

ans += p[i]

.mabs;if(

(p[i]

.mabs)

!=200)}

sort

(p, p + n /

2, cmp)

; ans +=

(100

+abs

(p[0

].b)

-(p[0]

.mabs));

if(flag)

ans -=1;

cout << ans << endl;

}return0;

}//input

/*2 1 2

2 -1 -2

2 -1 2

4 100 -100 -100 100

4 100 100 100 -100

*///output

/*102

102399

400*/

2019校賽總結

這是我第一次打的學校的比賽,大一時什麼都不懂錯過了新生賽和校賽 t t,大二時又不能打新生賽,直到這次。總的來說這次結果還可以接受吧。a了4題,做題太慢罰時多4題墊底,喜提簽到獎勵t shirt。簽到題很水,很快過了,不是一血,大佬手速太快了,b題卡了一會兒,主要原因是機器上的devc 不能單步除錯...

2019湘潭校賽題解

a 我真的沒鴿比賽。b 直接模擬就好。c a 3 192 1。同餘模定理得 a 192 a 192 a 192 192 1。那麼暴力0 192,看看有多少a滿足條件發現只有1。所以只要求l到r有多少個x 192 1就可以了。include define ll long long using name...

2019浙江理工校賽有感

校賽事情有點多,打著打著鍵盤居然壞了,氣哭,換了一台電腦,結果螢幕很暗,還有就是瀏覽器問題太大,居然不能複製樣例,害的我得手打,體驗極差.手打輸入法問題也挺大 打得居然是中文字元,改成 英文還是這樣,摸索了一會才發現訣竅.a題 水題,開場就有人過,手速真的快,orz b題 我想了好久發現資料量才50...