由於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-x
,x
為此時擁有的鑰匙中,和之後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...