**對於這道題其實沒有什麼好說的,就是一道十足的大水題(゚ー゚),運用佇列加上乙個判斷存在的陣列來快速查尋即可,需要注意的是此處的資料較小,可以只用將佇列的空間開的大一些,但如果以後遇見資料較大的佇列題時需要用到迴圈佇列
一下便是實現**:
**這道題第一次做的時候想到的是深搜+剪枝,將每個格仔上的分數都減去乙個較大的數,然後每次深蒐時若加和的值已經大於當前的答案時,就退出此次搜尋,本以為會減去大量的時間,結果果斷gg,只過了四個點;後來一想,這道題確實很想是到dp題啊。。。但是之所以一開始沒有用dp的原因便是找不到適合表示和推演的狀態。。。(這不是淚催嗎。。。(ノಠ益ಠ)ノ彡┻━┻)後來經過乙個ak大神的指點後思路才明了起來。。。將不同的卡牌的已用牌數牌數設為狀態,有就是用陣列dp[i][j][k][t]表示狀態,其中i表示第一種牌,j表示第二種牌,以此類推然後當前狀態dp[i][j][k][t]便是由max+scor[set]得來,set表示的是當前的位置(即:1+i+2*j+3*k+4*t)然後就簡單了。。。答案輸出dp[amount of i][amount of j][amount of k][amount of t]即可;
**題目的做法是了解了,但是此處我自己覺得仍需要總結一些關於此類dp問題的思路,今後,凡是遇見有類似此題,有多重型別和數量限制的題目(切數量不是特別大,就像此題便是),邊可以將其已用或未用數量作為狀態求解,切要注意型別與數量的關係,就比如在此題中個拍數與所行走到的位置的關係
以下為此題的實現**:
關押罪犯這道題看起來似乎有點像是圖論方面的題型,但實際上可以用二分答案來解決(當然某李姓大神也發現了一種並查集的方法,而且時間發雜度是o(n),但是表示我乙個弱沒有聽懂(。・・)ノ)
那麼先複習一下二分的思路和步驟:1.得中間值,2.check一遍,3如果r>l+1,goto(1.);而此題也不例外,但是重點就在check上了,畢竟丁神說過,二分能解的題都有一定的單調性,不一定是明顯的大小單調,但是這個單調性質能夠使我們知道什麼時候該往左邊縮區間,什麼時候該往右邊縮區間;
而此題乍一看似乎沒有特別明顯的單調性,但是用二分答案的步驟來想一下,先在有m=l+r/2,則比m大的邊就不能存在在圖中(即不能在同一監獄中),如果滿足次條件,則說明此m課以作為答案(但不一定是最小答案),則r=m;若不滿足,則說明此邊不是最小的最大邊,答案是乙個比它大的邊,所以l=m;
單調性是解決了,但是如何判斷比m大的邊所連的點能分到兩個組中使其兩兩不相連呢?這裡便可以用到染色法;
首先宣告,不是說在大於m的邊中有環其一定就不成立,如一下情況:
此情況便是有環但是可以區分成兩兩不相連的情況;(就是因為這個在下午該題時老是調不對)
那麼就要用到乙個染色法(以後在判斷分為兩互不相連的集合時就想想這方法);運用dfs,將起點染成一種顏色,然後再將其兒子(與其相連的節點染成不同的顏色(這裡可以用到異或,但要注意最好顏色用2,3表示,用1,0時就不能區分誰是沒走過的,誰是染成了0這個顏色的,除非將陣列的所有元素初始化為-1一類的值;))當發現本因染成不同顏色的點與自己的顏色相同時,return false,若便利完了所有的點並未出現上述情況則說明滿足要求,return true;
**如下:
#include
#include
#include
#define m 300000
using
namespace
std;
int yet[m],ind[m],sz;
int a[m],b[m],f[m],n,m;
struct node
}list[m];
void add(int a,int b)
bool dfs(int now,int f)
return
true;
}bool check(int now)
for(int i=1;i<=n;i++)
if(!yet[i])
return
true;
}int main()
if(check(l))printf("%d",l);
else
if(check(r))printf("%d",r);
return
0;}
由於時間關係,這裡不能將第四題總結出來,準備在下次總結中補上,對於本次考試,我還有其他關於考試技巧和知識查漏補缺的總結:
1.凡是遇見有有多型別數量限制的dp題目,想想將型別和其數量視為狀態來解題
2.遇見特徵不是很明顯的題目時,試著用二分答案,將關於m的單調性找出,如果有這試著去用二分來解題;(一般有最小中的最大或最大中的最小時,就很有可能是二分答案)
3.判斷分組時運用染色法;
4.若卡在一道題上超過十分鐘都沒有明顯的突破點,說明思路可能有問題,試著去找其他的思路;
那麼。。。就希望下次考試能吸取此次教訓,再將原來學習的知識點鞏固一下,多刷一些題。。。也拜託公主殿下能保佑,拜託╭( ・ㅂ・)و ̑̑
第一周總結
第一周學習總結 第一周,我們有學習,計算機的發展,起源,計算機的各種進化,還有計算機的概念,計算機的語言,計算機的組成這些等等。讓我深刻的意識到這是很龐大的一門課程,同時也對我們接下來要學習的課程充滿了期待。對於我自己來說,第一周的學習我還是覺得挺不錯的,挺開心的,能認識到這麼多的朋友,這麼多的知識...
第一周總結
第一周這麼快就過去了,剛開學第一周,沒能擠出很多時間來學習,週六看了一天的課件,把老師給的三個課件看了個遍,線段樹講解和 裡都有很多題目,通過講解更徹底的了解了一下線段樹的原理,線段樹構造,區間查詢,單點更新,區間更新都更具體的講解了一下。後面還有常用的一些模版,也研究了一下,熟悉了具體的原理。主要...
第一周總結
恩。作為新成員,加入大佬雲集的團體 當然,我是小透明.心理壓力特別大,因為我學習比較被動,並且比較慢,相比其他新成員 我的進度條真的相當於沒有動,深深的感覺到自己是個菜雞 很多人已經看完了html,造成這個問題可能有以下幾個原因 1.我覺得不能說我沒有用心,也不能說我不認真不努力 只是說比你優秀的人...