释放囚犯(洛谷-P1622)
題目描述
Caima王國中有一個奇怪的監獄,這個監獄一共有P個牢房,這些牢房一字排開,第i個緊挨著第i+1個(最后一個除外)。現在正好牢房是滿的。
上級下發了一個釋放名單,要求每天釋放名單上的一個人。這可把看守們嚇得不輕,因為看守們知道,現在牢房中的P個人,可以相互之間傳話。如果某個人離開了,那么原來和這個人能說上話的人,都會很氣憤,導致他們那天會一直大吼大叫,搞得看守很頭疼。如果給這些要發火的人吃上肉,他們就會安靜點。
輸入輸出格式
輸入格式:
第一行兩個數P和Q,Q表示釋放名單上的人數;
第二行Q個數,表示要釋放哪些人。
【數據規模】
對于100%的數據1≤P≤1000; 1≤Q≤100;Q≤P;且50%的數據 1≤P≤100;1≤Q≤5
輸出格式:
僅一行,表示最少要給多少人次送肉吃。
輸入輸出樣例
輸入樣例#1:
20 3
3 6 14
輸出樣例#1:
35
【樣例說明】
先釋放14號監獄中的罪犯,要給1到13號監獄和15到20號監獄中的19人送肉吃;再釋放6號監獄中的罪犯,要給1到5號監獄和7到13號監獄中的12人送肉吃;最后釋放3號監獄中的罪犯,要給1到2號監獄和4到5號監獄中的4人送肉吃。
思路:
設 f[i][j] 為區間釋放 i~j 號囚犯所需最少的肉,枚舉所有分界點 k,則:f[i][j]=min{f[i][j],f[i][k-1]+f[k+1][j]+a[j+1]-a[i-1]-1-1}
a[j+1]-a[i-1]-1 是第 j+1 個要放出的囚犯到第 i-1 個要放出的囚犯之間的人數,也即要發的肉的數量
最后一個 -1 ,就是第 k 個放出去的囚犯,不用再給他發肉了
源代碼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<map> #include<stack> #include<ctime> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 10001 #define MOD 1e9+7 #define E 1e-6 #define LL long long using namespace std; int a[N]; int f[N][N]; int main() {int p,q;cin>>p>>q;for(int i=1;i<=q;i++)cin>>a[i];a[0]=0;a[q+1]=p+1;sort(a+1,a+q+1);for(int len=1;len<=q;len++)//枚舉區間長度{for(int i=1;i+len-1<=q;i++)//枚舉所有起點{int j=i+len-1;//終點位置f[i][j]=INF;for(int k=i;k<=j;k++)//枚舉所有間斷點f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+a[j+1]-a[i-1]-1-1);}}cout<<f[1][q]<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的释放囚犯(洛谷-P1622)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后缀表达式的值(信息学奥赛一本通-T13
- 下一篇: 局域网(信息学奥赛一本通-T1391)