題目描述:
為了迎接奧運,市體育局舉行手拉手大包圍活動,開始時n個人手拉手圍成乙個圈。後來這些人中的一些按順序向裡面出圈形成乙個新圈。從而使原圈形成乙個從高到低,最低與最高連線的圈。新圈重複相同的操作,直到沒有人要出圈為止。問最少要形成多少個這樣的圈。
輸入:第一行n個人,第二行輸入n個人的身高(每個身高中用空格隔開)n<=1000
輸出:最少形成多少個這樣的圈。
很容易看出和飛彈攔截的第二問是一樣的模型。。只是多了環
只是我筆算驗證的時候很是不確定,因為樣例都畫不出來。。然後,猥瑣地瞟了一眼討論,大家都是這樣想的,於是乎就打下去了
是那乙個定理,下降子串行的個數等於最長不降子串行的長度。
但是由於有環,因此要列舉斷點,每次都要把s陣列初始化(高度是無限高),s[1]要設成第乙個點然後從第二個點開始遞推,不然沒法遞推下去
提交三次:
1、超時,樸素o(n^3)
2、超時,加了幾個係數優化,無用。
3、ac,改了二分,因為在同乙個大區間內,乙個較短的下降序列和乙個較長的下降序列,(我們只記錄下序列中最高的那個最低的乙個序列),前者中最高的必定比後者最高的矮!因此對於可行性有單調性。
應該說現在二分實現上比較熟了吧,只是可能有些建模,要找出單調性,不知道能力如何
#include #include #include inline long getint()
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}long h[1010];
long s[1010];
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
long maxs = 0;
long height = 0;
long find()
else
}return out;
}int main()
ans = min(ans,maxs);
} printf("%ld",ans);
return 0;
}
樸素:
#include #include #include inline long getint()
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}long h[1010];
long f[1010];
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
int main()}}
} ans = min(ans,_ans);
} printf("%ld",ans);
return 0;
}
動態規劃 最優二分檢索樹
最優二分檢索樹 最優二分檢索樹問題 求一棵使得預期成本最小的二分檢索樹 或是一棵空樹 或者是具有如下性質的非空二叉樹 1 左子樹的所有結點均小於根的值 2 右子樹的所有結點均大於根的值 對於乙個給定的識別符號集合,可能有若干棵不同的二分檢索樹 不同形態的二分檢索樹對識別符號的檢索效能是不同的。設給定...
模擬題 二分 動態規劃 神光
題目描述 亮亮成功地唸出了咒語,石門緩緩地自動移開,一道道絢麗的神光從城堡內激射而出。亮亮好奇而又興奮地走入了城堡中,迎面有一座極長的魔法陣。魔法陣可以看作一條直線,它被均勻地分成了1000000000 1 000 000 000 100000 0000 個位置,乙個位置可以看成是乙個格仔。有些位置...
xjoi 二分查詢 道路規劃
70分 n 2 lis include include include include using namespace std int n,nor 100010 sou 100010 c 100010 q 100010 dp 100010 ans 0 int main for int i 1 i n...