中石油 暑期集訓個人賽第一場 題解
首先是簽到題部分:A,E,I. 傳送門:點選開啟連結
然後是DP部分:C,G,H. 傳送門:點選開啟連結
還有其他:B,J,H,F.
神奇的B題(我的第一個一血)
問題 B: 拯救小雞
時間限制: 1 Sec 記憶體限制: 128 MB提交: 73 解決: 36
[提交][狀態][討論版]
題目描述
雞國最近遇到了一件很棘手的事情,經常有一隻老鷹想來抓小雞。經雞國情報員探查,這隻老鷹打算共來襲擊 n 次,第 i 次來的時刻為第 t i (1≤i≤n) 秒時刻。雞國國王為了保護雞國中的小雞,決定派出雞國警察(雞國有無窮多個警察)來巡邏。
每個警察巡邏的時間長度都為 t 秒。當老鷹來襲擊的時刻至少要有 x 名警察才能抵禦老鷹的襲擊。另外國王派遣警察有兩個原則:
(1)每個時刻最多隻能派遣一名警察。在第 0 秒時刻及第 0 秒之前的時刻(雞國有負數時刻)也可以事先準備派遣警察,但每個時刻最多也只能派遣一名警察。
(2)延遲 1 秒執行巡邏任務。第 i 秒時刻派遣的警察,在第 i+1 到 i+t 秒時刻執行巡邏任務。
為幫助國王節省開支,請幫忙計算至少需要派遣多少名警察才能保證雞國小雞不被老鷹抓走?
輸入
輸入共 2 行。第 1 行輸入三個整數 n,t,x,分別表示老鷹總共襲擊次數,每個警察巡邏的時間長度為,以及某個時刻能抵擋住老鷹襲擊的最少警察數量。
第 2 行 n 個嚴格升序排列的正整數 t i (1≤i≤n),表示第 t i 秒時刻老鷹會發動襲擊。
輸出
輸出 1 行一個整數,表示總共至少需要派遣多少個警察才能抵禦老鷹的 n 次襲擊,如果出現無法抵禦老鷹的襲擊時,輸出“-1”(不包含雙引號)。樣例輸入
3 3 3
2 3 4
樣例輸出
5
做題的時候沒看榜,一看初中組,感覺不會太難,就按順序做,一小時左右A到,才發現是B題的一血。
這題真沒想到模擬也可以過,還不超時。這題最終可以歸結為求重複區間的問題,列舉時間軸,時間的區間是固定的。用陣列標記老鷹出現的時間小雞的個數,列舉時間的左端點,再列舉老鷹出現的時間,若重合,則+1.最後掃一遍標記陣列,如有未達到目標的,直接輸出-1.
程式碼實現:
簡單的J題#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; int main() { int n,t,x,a[100005],i,j,count,visit[100005]; while(cin>>n>>t>>x) { memset(visit,0,sizeof(visit)); for(i=0;i<n;i++) cin>>a[i]; int flag=0,ans=0; for(j=a[0]-t+1;j<=a[n-1];j++) { for(i=0;i<n;i++) { if(j+t>a[i]) { visit[i]++; } } ans++; if(visit[n-1]>x) break; } for(i=0;i<n;i++) if(visit[i]<x) flag=1; if(flag) cout<<"-1"<<endl; else cout<<ans<<endl; } return 0; }
問題 J: 【搜尋】泡泡龍
時間限制: 1 Sec 記憶體限制: 64 MB提交: 156 解決: 63
[提交][狀態][討論版]
題目描述
這是一個簡化版的網路遊戲:在一個N×N方塊構成的棋盤中,每個方塊均塗上紅、黃、藍、綠(記為l、2、3、4)中的一種顏色,遊戲者可以在最底行任意找一個方塊,用滑鼠雙擊這個方塊,於是該方塊及與之相鄰(即在上、下、左、右四個方向上有公共邊)的所有的同色方塊均被消掉,而因下方失去支援的方塊將會自由落下填補空位。樣例中給出一個4×4的棋盤樣例,當遊戲者雙擊最底層左邊第二個方塊後,將會形成輸出結果的佈局。
你的任務是編寫一個泡泡龍模擬程式,對於給定的一個初始棋盤,計算遊戲者雙擊最底層某個方塊後棋盤的佈局將會如何。
輸入
第1行有兩個正整數N和M(I≤M≤N≤I00),其中N表示棋盤的規模,而M則表示遊戲者將雙擊最底層從左邊數起的第M個方塊。接下來的N行每行有N個l~4的整陣列成,表示一個初始的棋盤,同一行相鄰兩個數之間用一個空格隔開。
輸出
N行,每行用N個數給出遊戲結束後棋盤的佈局,沒有方塊的格子用0表示,同一行相鄰兩個數之間也用一個空格分開。每行末尾有空格
樣例輸入
4 2
1 2 3 4
4 2 4 4
3 4 4 3
1 4 4 3
樣例輸出
1 0 0 0
4 0 0 0
3 2 0 3
1 2 3 3
搜尋的水題啊,dfs把相同且相鄰的標記為0,然後再把不是0的落下來,上面的補成0.這種題竟然做了半小時。腦卡。
程式碼實現
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int next1[4][2]={1,0,0,1,-1,0,0,-1};
int map[105][105];
int n,s;
void dfs(int x,int y,int z)
{
int i;
for(i=0;i<4;i++)
{
int tx=x+next1[i][0];
int ty=y+next1[i][1];
if(tx<0||tx>=n||ty<0||ty>=n)
continue;
if(map[tx][ty]==z)
{
map[tx][ty]=0;
dfs(tx,ty,z);
}
}
return ;
}
void find()
{
int i,j,k;
for(i=n-1;i>=0;i--)
{
for(j=0;j<n;j++)
{
if(map[i][j]==0)
{
for(k=i;k>=0;k--)
{
if(map[k][j])
{
map[i][j]=map[k][j];
map[k][j]=0;
break;
}
}
}
}
}
}
int main()
{
int i,j;
while(cin>>n>>s)
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>map[i][j];
int z=map[n-1][s-1];
dfs(n-1,s-1,z);
map[n-1][s-1]=0;
find();
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<map[i][j]<<' ';
cout<<endl;
}
}
return 0;
}
矇蔽的D題
問題 D: 雞國福利
時間限制: 1 Sec 記憶體限制: 128 MB提交: 115 解決: 9
[提交][狀態][討論版]
題目描述
雞國為了表彰雞國每一隻雞在過去一年的優秀表現,打算在接下來的 n 天中每天給雞國的一隻雞發 1 袋或者 2 袋“雞幣”(雞國的通用貨幣)作為福利。國王要求每天來領錢雞互不相同,即來領過錢的雞不能再來,否則將受到嚴厲的處罰。
但聰明的雞國老百姓偵察後發現國王每天發的錢袋子裡面裝的錢數量是不一樣的(同一天的相同),第 i 天發的每一袋錢為 a i 元。如果第 i 天來領錢的雞領 1 袋錢,它可以獲得ai 元的“雞幣”,如果它領 2 袋錢,則可以獲得 2×ai 元“雞幣”,當然它也可以放棄,則第i 天的錢國王收回國庫。
由於雞國生活條件優越和雞的貪念等原因,當第 i 天領錢的雞同時滿足以下兩個條件時它才會感到幸福:
(1)領到的錢不能低於雞國的平均收入 m 元。
(2)要跟它前面領了錢且感到幸福的雞一樣幸福或者更幸福。
仁慈的國王希望雞國的每一隻雞都能感到幸福,請你幫國王規劃一下在這 n 天中怎樣給每一隻發錢才能讓最多的雞感到幸福?
輸入
輸入共 2 行。第 1 行輸入兩個整數 n 和 m,分別表示發錢的天數(或理解為來領錢的雞數)和雞國的平均收入。
第 2 行 n 個正整數 ai (1≤i≤n),依次表示第 i 天發的一袋錢中的“雞幣”為 ai 元。。
當時沒做出來,現在看到了別人的題解。傳送門:點選開啟連結
還有F題
問題 F: match
時間限制: 1 Sec 記憶體限制: 128 MB提交: 71 解決: 27
[提交][狀態][討論版]
題目描述
小 x 在解說 F7 決賽時的搭檔是韓喬生,以至於小 x 沒有任何能說上話的機會。無聊的他玩起了填字遊戲。一個 3*3 的九宮格里,每個格子裡都被填上了一個字母,從而我們得到了 6 個單詞。現在,小 x 隨手寫了 6 個單詞,他想讓你幫他找到一種填字母的方案,使得這 6 個單詞都出現在了九宮格里。輸入
共六行,每行一個長度為 3 的單詞(全部大寫)。輸出
如果找不到方案,輸出“0”(不包含引號)如果能找到,輸出包含 3 行,第 i 行對應九宮格的第 i 行(最後一行行末要換行)。
如果有多種方案,請輸出每種方案對應的字串中字典序最前的一種(將行與行首尾相連,就可以得到一個字串)。
樣例輸入
ANA
ANA
DAR
DAR
RAD
RAD
樣例輸出
DAR
ANA
RAD
題目很容易讓人懂,要注意字典序輸出。由於題目資料量很小,完全可以暴力模擬每一個單詞,最後得到結果。
貼一下學長的程式碼,傳送門:點選開啟連結
總結
感覺還不錯,但還是有還多要深入研究的,知識多了,做題自然簡單,就像H題,當初備戰省賽做了48道DP專題,遇到了類似的題,雖然省賽沒用到,但遲早會遇到,暑假才剛開始,暑假過後,必須拿出點成績。