這題就是noip2013 積木大賽原題=。=,貪心地想,如果 a
i>ai
−1a_i > a_
ai>ai
−1, ans
+=ai
−ai−
1ans+=a_i-a_
ans+=a
i−a
i−1
,因為搞 ai−
1a_ai−1
的時候,能盡量搞 a
ia_i
ai 就搞 a
ia_i
ai。
#include
#include
#include
using
namespace std;
int a[
100001
], max1, s;
intmain()
printf
("%d"
,s);
return0;
}
由於 b
bb 與 a
aa 等價且 b
bb 要盡量小,b
bb 肯定是 a
aa 的子集,其中對於 x∈a
,x∉b
x\in a,x \notin b
x∈a,x∈
/b,x
xx 能用 b
bb 中的元素表示。
於是我們將 a
aa 排個序跑個揹包就可以了。
#include
using
namespace std;
int f[
25005
], a[
105]
, ans;
intmain()
printf
("%d\n"
, ans);}
return0;
}
要求最小的最大,於是我們二分。
那怎麼 che
ckcheck
chec
k 呢?
首先,如果是一條鏈的情況,明顯就是長度到了 t
tt 就 tot
+1tot+1
tot+1。
於是我們從下往上每到乙個分叉點,一定匯聚了多條長度小於 t
tt 的鏈,如圖。
紅色的是 3
33 條未到 t
tt 的鏈,顯然只有 1
11 條可以繼續往上延伸,其他鏈都要在這裡進行合併。於是我們就對每個節點維護乙個 mul
tise
tmultiset
multis
et,放置這些鏈。然後每次從這些鏈中貪心地合併,最後剩的最大那條鏈向上傳遞。這樣我們就保證了長度大於 t
tt 的鏈總數盡量大。
總結就是這道題用了幾個貪心:
第乙個是單鏈上要貪心,第二個是合併的時候要貪心,第三個是傳遞的時候要貪心,這些貪心保證了解的最優性。
#include
#define n 50005
#define inf 2147483647
using
namespace std;
struct noded[n *2]
;int h[n]
, cnt, n, m, t, f[n]
, tot;
intread()
voidcr(
int a,
int b,
int c)
void
dfs(
int a,
int p)
while
(!s.
empty()
) it = s.
lower_bound
(t -
*s.begin()
);if(it == s.
begin()
&& s.
count
(*it)==1
) it++;if
(it == s.
end())
else}}
intok
(int t)
intmain()
r /= m;
while
(l < r)
printf
("%d"
, l)
;return0;
}
這道題考的應該是邊排序,首先對 m=n
m = n
m=n 的情況,我們列舉斷掉的邊,那麼問題就變成了 m=n
−1m = n-1
m=n−
1 的情況。我們考慮在 o(n
)o(n)
o(n)
複雜度下解決 m=n
−1m = n - 1
m=n−
1的情況。
應該不難發現,題目中所得到的序列就是樹的 dfs
dfsdf
s 序,我們要讓字典序盡量小,只要讓每個節點訪問的點按從小到大排序就可以了。如何實現這個排序呢?
我的做法是先讓所有邊的出點按從小到大排序,然後單獨對每個點再來加邊(emmm我突然發現有點難說,大家看**吧
#include
#define n 10005
using
namespace std;
struct node
}d[n]
, e[n]
, re[n]
;int h[n]
, p[n]
, v[n]
, vis[n]
, n, cnt, ret, tot, ans[n]
;int mp[
5005][
5005];
voidcr(
int a,
int b)
void
crr(
int a,
int b)
void
dfs(
int a)
}void
dfs1
(int a)
}void
cmp()if
(vis[i]
> ans[i]
)return;}
}int
main()
sort
(e +
1, e + tot +1)
;for
(i =
1; i <= tot; i++
)for
(a =
1; a <= n; a++)}
if(m == n -1)
dfs(1)
;else
for(i =
1; i <= n; i++
)printf
("%d "
, ans[i]);
}return0;
}
NOIp2018解題報告
ans sum a a 正確性可由貪心證得 考慮貪心,選出乙個屬於a的集合,容易證明其是最優的 然後考慮乙個數如果不被選,則他需要滿足那些條件,發現是他可以被已選出的一些數表示 那麼這就是乙個要求不斷加點的完全揹包,和普通完全揹包無異 看到最大值最小直接二分 直接考慮二分lim為最小的最大權 考慮乙...
noip2018滾粗報告
一切都結束了。tg327,夢醒了。day1是真炸了,別人都290,300,就我股份170,t2降智,continue打成return 0,直接爆了,t3sb到就打了20分,真不知道自己是怎麼想的,可惜。day2t1不會,騙了72,t2真心不會,打了50分,其中n 3硬是沒打出來,我真是辣雞,t3暴力...
NOIP2018模擬賽10 16 手殘報告
爐石亂鬥模式美滋滋啊,又頹到好晚.上來t2先敲了樹剖,看t1發現是個思博dp,然後沒過大樣例,寫個暴力發現還是沒過大樣例 才發現理解錯題意了,真是太菜了 然後看t3發現又要樹剖,想了想發現邊雙縮點似乎能做.結果碼來碼去比賽臨近結束才搞完,趕緊交 但是那台機子上的chrome似乎是個假的,開啟什麼網頁...