不充錢,你怎麼ac?
題目:大家都寫的 dfs,然而我想到了一種貪心的做法,重點是可以a
普遍的貪心是每次刪掉該深度子樹最大的點,但是如果有一邊卡一條鏈就會wa
我們何不進一步考慮貪心,如果它下面是一條鏈我們就可以緩一緩到第 2 天再刪是不是,反正它每次也就增加乙個人
用 size[x] 記錄所有後代加上自己的節點個數,f[x] 記錄其最大子樹的 size 值
我們考慮第一次不刪這個節點,讓它先擴充套件一次,然後第二次再刪除它子樹中 size 最大的節點
那麼設 g[x]=size[x]-f[x],g 就為第一次不刪,第二次刪掉其最大的子樹還剩餘的節點數
那麼一層層地貪心,每次刪掉 g 值最大的節點,直到不再繼續傳染為止
貪心跑得飛快~
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
namespace
std;910
const
int n=301
;11 stacks,q;
12int first[n],v[n*2],next[n*2
],size[n],g[n],f[n];
13void dfs(int x,int
fa)14
23 size[fa]+=size[x];24}
25int
main()
2638
for (i=1;i<=n;i++) size[i]=1
;39 dfs(1,0
);40
for (i=1;i<=n;i++) g[i]=size[i]-g[i];
41 s.push(1
);42 g[0]=size[0]=0
;43 ans=n;
44while (!s.empty())
4557}58
while (!q.empty())
5965
}66 printf("
%d\n
",ans);
67return0;
68 }
這裡有個dfs的:
貪心的做法證明有人會嚴謹的嗎?會的話告訴我謝謝!
CodeVS沖杯之路 P1165
不充錢,你怎麼ac?題目 題目很簡單,最好寫樸實一點,不要想著哪些情況可以合併在一起啊等等 老老實實乙個個判斷,不然很容易出錯 細節很多,幸好樣例給的良心,可以檢測出很多細節 自己字串模擬即可,一定要細心!1 include2 include3 include4 include5 include6 ...
CodeVS沖杯之路 P1092
不充錢,你怎麼ac?題目 嗯,這道題有一定難度啊,需要先用擴充套件歐幾里得演算法求出逆元,然後按照大小構一顆帶邊權為小時數的樹 樹鏈剖分後在樹上dp,設f i j 為以 i 為根 j 為子樹的最小的那一天 注意dp方程是有單調性的,可以用動態仙人掌維護,最後答案容斥一下即可 目測 量8k 1 inc...
CodeVS沖杯之路 P1171
不充錢,你怎麼ac?題目 調了很久才調好啊,一開始題目都看錯了 要是真的noip肯定沒戲了quq 後面發現codevs上的資料輸入最後是沒有回車的,導致wa爛啊 給你兩個串,它們每個字母有一一對應的關係,如果遇到不同字母對應相同的就 failed 或者相同字母對應不同字母也 failed,如果最後 ...