洛谷傳送門
顯然這是一棵樹(這個就不多bb了,樹的性質)#include#include#include#include#include#include#include#include#include#include#include#define rg register很容易發現乙個性質,如果一條鏈走完,我們必須回頭再走一次那條鏈(或一部分)才可以走到更多的點
所以為了減少這個損失,我們以最長鏈(從起點開始的最長鏈)的終點(最低端)為終點(步數走完不須回頭),既然做到減少了最多的不必要,那麼這樣一定會是最優的。(可以證明是最優的,只是我不知道,舉不出反例我就寫了)
考慮除了走最長鏈步數之外的剩餘步數。最好畫個圖,既然我們一定要走最長鏈,那麼可以看做一根樹幹上長了其他的一些枝條,我們的剩餘步數就是用來走這些地方的,很容易證明一定可以額外走到 (剩餘步數/2) 個節點(最長鏈之外)。
沒了……(**實現基本沒難度)
#define il inline
#define lst long long
#define ldb long double
#define n 150
using namespace std;
const int inf=1e9;
int n,step,cnt;
int ans,ans_st;
struct edgeljl[n<<1];
int hd[n];
int vis[n];
il int read()
while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}il void add(rg int p,rg int q)
,hd[p]=cnt;
}void dfs(rg int fm,rg int now,rg int st,rg int ss)
}int main()
{ n=read(),step=read();
for(rg int i=1;i**還是很好看的,只是變數為了通俗就很醜
小Q的棋盤 貪心
洛谷傳送門 顯然這是一棵樹 這個就不多bb了,樹的性質 很容易發現乙個性質,如果一條鏈走完,我們必須回頭再走一次那條鏈 或一部分 才可以走到更多的點 所以為了減少這個損失,我們以最長鏈 從起點開始的最長鏈 的終點 最低端 為終點 步數走完不須回頭 既然做到減少了最多的不必要,那麼這樣一定會是最優的。...
CQOI2017 小Q的棋盤
問題描述 小q正在設計一種棋類遊戲。在小q設計的遊戲中,棋子可以放在棋盤上的格點中。某些格點之間有連線,棋子只能 在有連線的格點之間移動。整個棋盤上共有v個格點,編號為0,1,2 v 1,它們是連通的,也就是說棋子從任意格 點出發,總能到達所有的格點。小q在設計棋盤時,還保證棋子從乙個格點移動到另外...
CQOI2017 小Q的棋盤
看到這道題,很容易想到是一道樹型dp,那麼該如何做?首先我們可以先這樣定義狀態,fi,jf fi,j 表示以i ii為根節點,向下走j jj步最多能經過多少點,但很明顯,只是這樣是不行的,所以我們再加一維,第三維為0表示不會到根節點,第三維為1表示需要回到根節點,那麼就可以得出狀態轉移方程 f ma...