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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

每日一九度之 题目1030:毕业bg

發(fā)布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每日一九度之 题目1030:毕业bg 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

時間限制:1 秒

內(nèi)存限制:32 兆

特殊判題:

提交:2046

解決:894

題目描述:
每年畢業(yè)的季節(jié)都會有大量畢業(yè)生發(fā)起狂歡,好朋友們相約吃散伙飯,網(wǎng)絡(luò)上稱為“bg”。參加不同團體的bg會有不同的感覺,我們可以用一個非負整數(shù)為每個 bg定義一個“快樂度”。現(xiàn)給定一個bg列表,上面列出每個bg的快樂度、持續(xù)長度、bg發(fā)起人的離校時間,請你安排一系列bg的時間使得自己可以獲得最 大的快樂度。

??? 例如有4場bg:
??? 第1場快樂度為5,持續(xù)1小時,發(fā)起人必須在1小時后離開;
??? 第2場快樂度為10,持續(xù)2小時,發(fā)起人必須在3小時后離開;
??? 第3場快樂度為6,持續(xù)1小時,發(fā)起人必須在2小時后離開;
??? 第4場快樂度為3,持續(xù)1小時,發(fā)起人必須在1小時后離開。
??? 則獲得最大快樂度的安排應(yīng)該是:先開始第3場,獲得快樂度6,在第1小時結(jié)束,發(fā)起人也來得及離開;再開始第2場,獲得快樂度10,在第3小時結(jié)束,發(fā)起人正好來得及離開。此時已經(jīng)無法再安排其他的bg,因為發(fā)起人都已經(jīng)離開了學校。因此獲得的最大快樂度為16。

??? 注意bg必須在發(fā)起人離開前結(jié)束,你不可以中途離開一場bg,也不可以中途加入一場bg。
又因為你的人緣太好,可能有多達30個團體bg你,所以你需要寫個程序來解決這個時間安排的問題。
輸入:
測試輸入包含若干測試用例。每個測試用例的第1行包含一個整數(shù)N (<=30),隨后有N行,每行給出一場bg的信息:
??? h l t
??? 其中 h 是快樂度,l是持續(xù)時間(小時),t是發(fā)起人離校時間。數(shù)據(jù)保證l不大于t,因為若發(fā)起人必須在t小時后離開,bg必須在主人離開前結(jié)束。

??? 當N為負數(shù)時輸入結(jié)束。
輸出:

??? 每個測試用例的輸出占一行,輸出最大快樂度。

樣例輸入:
3 6 3 3 3 2 2 4 1 3 4 5 1 1 10 2 3 6 1 2 3 1 1 -1
樣例輸出:
7 16

第一眼的感覺就是這題不是貪心就是DP,果然---DP。

DP不熟啊!

參考代碼:http://blog.csdn.net/wtyvhreal/article/details/42076485

//Asimple #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cctype> #include <cstdlib> #include <stack> #include <cmath> #include <map> #include <string> #include <queue> #define INF 100000 using namespace std; const int maxn = 1005; typedef long long ll; int m[31][maxn]; int n; struct bg_typ{int h;int l;int t;bool operator < (const bg_typ& A) const {return A.t > t;} }; bg_typ bg[31];int main(){while( cin >> n && n >= 0 ){int mmax = 0;for(int i=1; i<=n; i++){cin >> bg[i].h >> bg[i].l >> bg[i].t ;if( bg[i].t > mmax ) mmax = bg[i].t; }sort(bg+1,bg+n+1);for(int i=0; i<=n; i++)m[i][0] = m[0][i] = 0;for(int i=1; i<=n; i++){for(int j=0; j<=mmax; j++){if( j<=bg[i].t && j-bg[i].l>=0){m[i][j] = max(m[i-1][j],m[i-1][j-bg[i].l]+bg[i].h);} else m[i][j] = m[i-1][j];}}int result=m[n][mmax]; for(int j=mmax;j>=0;--j)if(result<m[n][j]) result=m[n][j]; cout<<result<<endl; }return 0; }

翻了翻題解,看到有的用dfs也做出來了,就測試了下是DP好,還是DFS好。

DFS代碼:

#include <cstdio> #include <algorithm> using namespace std; const int N = 30 + 5; struct Node { int h; int l; int t; }; int n; Node node[N]; int ans; int w; bool cmp(const Node &a, const Node &b); void dfs(int cur, int t, int h); int main() { #ifndef ONLINE_JUDGE freopen("e:\\uva_in.txt", "r", stdin); #endif // ONLINE_JUDGE while (scanf("%d", &n) == 1) { if (n < 0) break; w = 0; for (int i = 0; i < n; i++) { scanf("%d%d%d", &node[i].h, &node[i].l, &node[i].t); w += node[i].h; } sort(node, node + n, cmp); ans = 0; dfs(0, 0, 0); printf("%d\n", ans); } return 0; } bool cmp(const Node &a, const Node &b) { if (a.t != b.t) return a.t < b.t; return (double)a.h / a.l > (double)b.h / b.l; } void dfs(int cur, int t, int h) { if (cur == n) { if (ans < h) ans = h; return; } w -= node[cur].h; if (t + node[cur].l <= node[cur].t) { dfs(cur + 1, t + node[cur].l, h + node[cur].h); } if (h + w > ans) dfs(cur + 1, t, h); w += node[cur].h; }

在杭電測試的,上面的是動態(tài)規(guī)劃,下面的是dfs。

?Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
182272612016-09-11 10:40:16Accepted188146MS1928K1480 BC++Asimple
182272522016-09-11 10:39:32Accepted188162MS1720K1405 BC++Asimple

各有各的優(yōu)勢吧!

轉(zhuǎn)載于:https://www.cnblogs.com/Asimple/p/5861206.html

總結(jié)

以上是生活随笔為你收集整理的每日一九度之 题目1030:毕业bg的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。