NOIP2012模擬11 1 塔(加強)

2022-08-18 05:21:09 字數 927 閱讀 1133

玩完骰子遊戲之後,你已經不滿足於骰子遊戲了,你要玩更高階的遊戲。

今天你瞄準了下述的好玩的遊戲:

首先是主角:塔。你有n座塔一列排開。每座塔各自有高度,有可能相等。

這個遊戲就不需要地圖了。

你每次可以選擇相鄰的兩座塔合併在一起,即這兩座塔的高度疊加後變成了同一座塔。然後原本分別與這兩座塔相鄰的塔變得與這座新的塔相鄰。

你的目標是在使用最少的操作次數在遊戲的最後獲得一列塔,這些塔的高度從左到右形成乙個不下降的數列。

這是到結論題。。。

結論一:每個塊越小越好。

so,設\(f_i\)表示處理完了i的最小操作次數。再設\(h_i\)表示最優情況下的\(g_i\)的i所在的塔的高度最小值。

轉移為:

\[f_i=min(f_i,f_j+i-j-1(g_j<=sum(j+1...i)))

\]這是\(o(n^2)\)的。

我們想辦法優化它,

首先,因為\(f_i+1>=f_\)

結論二,當我們列舉j從後往前搜,當高度合法,就是最優的答案,也就可以break。

但是,這還是超時了。

我們打個單調佇列。

#include #include #include #include #include #include #include const long long maxlongint=2147483647;

const long long mo=1000000007;

const long long n=1000025;

using namespace std;

long long f[n],a[n],n,maxa,ans=maxlongint,sum[n],g[n],d[n];

int main()

printf("%lld",f[n]);

}

NOIP2012模擬10 25 旅行

給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 x x.第...

NOIP2012模擬10 25 剪草

首先分析的出兩個結論,1 每棵草最多隻剪一次 2 按照生長速度,先剪小的,再剪大的。不難證明,略。那麼把小草按生長速度從大到小排個序後,設f i,j 表示,在倒數第i個時刻,已經處理了j棵草時的最小高度和。轉移為f i j min f i j 1 f i 1 j 1 a j g a ns i 1 a...

NOIP2012模擬10 25 旅行

給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 xx.50...