日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

释放囚犯(洛谷-P1622)

發布時間:2025/3/17 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 释放囚犯(洛谷-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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。