二分與貪心-Gone Fishing(演算法基礎 第9周)
問題描述:
分析
共n個湖,h個小時的時間;每個湖首次可釣到fi條魚,往後一次遞減di條,從i湖走到i+1湖需ti×5分鐘。問:指定時間內最多可釣多少條魚。
參考程式碼;http://blog.csdn.net/lyhvoyage/article/details/23289531 。按他的方式,第一種方法測試超時,第二種使用優先佇列方法可以通過。但自己寫了兩個,即使使用優先佇列也會超時,呃,,鬱悶,,程式碼先放這兒,以後再調。
原始碼
//程式碼1,不使用優先佇列,超時
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int n, h;
vector<int> fi(25), di(25), ti(25);
int ft[25];
//在0~k之間釣魚
int index_maxfi(const int& k,const vector<int>& kfi) {
int ind=0;
int maxfi=kfi[0];
for(int i=1; i<=k; i++) {
if (maxfi<kfi[i]){
maxfi=kfi[i];
ind=i;
}
}
return ind;
}
//在0~k之間釣魚
int fish(const int& k, vector<int> kfi) {
int nfishes=0;
int rest_h=h;
int ind;
while(rest_h) {
ind = index_maxfi(k, kfi);
if (kfi[ind]==0) {
ft[0] += rest_h;
break;
}
nfishes += kfi[ind];
ft[ind]++;
if (kfi[ind]>di[ind])
kfi[ind] -= di[ind];
else
kfi[ind] = 0;
rest_h--;
}
return nfishes;
}
int main() {
while(cin>>n && n>0) {
cin >> h;
h *= 12;
for(int i=0; i<n; i++) {
cin >> fi[i];
}
for(int i=0; i<n; i++) {
cin >> di[i];
}
for(int i=0; i<n-1; i++) {
cin >> ti[i];
}
int maxfishes=0;
vector<int> fishtime(n, 0);
for (int i=0; i<n; i++)
{
if (i>0){
h -= ti[i-1];
}
memset(ft, 0, sizeof(ft));
int tempf=fish(i, fi);
if (maxfishes < tempf) {
maxfishes = tempf;
for (int j=0; j<=i; j++){
fishtime[j] = ft[j]*5;
}
}
}
cout << fishtime[0];
for(int i=1; i<n; i++) cout << ", " << fishtime[i];
cout << endl;
cout << "Number of fish expected: " << maxfishes << endl;
cout << endl;
}
}
//程式碼2,使用優先佇列,還是超時,日後再看
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <stdio.h>
using namespace std;
int n, h;
int ft[25];
struct Fish
{
int i; //ith個魚塘
int f;
int d;
int t;
Fish():i(99),f(0),d(0),t(0) {}
};
bool operator < (const Fish& a, const Fish& b){
if (a.f==b.f){
return a.i>b.i; //如果多個計劃存在時,選擇靠前的
}
else {
return a.f<b.f;
}
}
vector<Fish> gofish(25);
//在0~k之間釣魚
int fish(int& k) {
int nfishes=0;
int rest_h=h;
priority_queue<Fish, vector<Fish>, less<Fish> > q;
for(int i=0; i<=k; i++) {
q.push(gofish[i]);
}
Fish topfish;
while(rest_h) {
topfish=q.top();
if (topfish.f==0){
ft[0] += rest_h;
break;
}
nfishes += topfish.f;
ft[topfish.i]++;
if (topfish.f>topfish.d)
topfish.f -= topfish.d;
else
topfish.f = 0;
q.pop();
q.push(topfish);
rest_h--;
}
return nfishes;
}
int main(){
while(~scanf("%d",&n) && n>0) {
scanf("%d",&h);
h *= 12;
for(int i=0; i<n; i++) {
scanf("%d",&gofish[i].f);
gofish[i].i=i; //為每個魚塘編上號
}
for(int i=0; i<n; i++) {
scanf("%d",&gofish[i].d);
}
for(int i=0; i<n-1; i++) {
scanf("%d",&gofish[i].t);
}
int maxfishes=0;
vector<int> fishtime(n, 0);
for (int i=0; i<n; i++)
{
if (i>0){
h -= gofish[i-1].t;
}
memset(ft, 0, sizeof(ft));;
int tempf=fish(i);
if (maxfishes < tempf) {
maxfishes = tempf;
for (int j=0; j<=i; j++){
fishtime[j] = ft[j]*5;
}
}
}
cout << fishtime[0];
for(int i=1; i<n; i++) cout << ", " << fishtime[i];
cout << endl;
cout << "Number of fish expected: " << maxfishes << endl;
cout << endl;
}
return 0;
}
相關文章
- [Coursera]演算法基礎_Week8_二分與貪心_Q1演算法
- [Coursera]演算法基礎_Week8_二分與貪心_Q3演算法
- [Coursera]演算法基礎_Week8_二分與貪心_Q2演算法
- 演算法基礎–貪心策略演算法
- 演算法基礎 - 列舉/遞迴/動歸/深廣搜/二分/貪心演算法遞迴
- 貪心演算法演算法
- 【基礎演算法】(07)五大常用演算法之三:貪心演算法演算法
- 貪心演算法(貪婪演算法,greedy algorithm)演算法Go
- 資料結構與演算法——貪心演算法資料結構演算法
- dfs與貪心演算法——洛谷5194演算法
- 學一下貪心演算法-學一下貪心演算法演算法
- 貪心演算法Dijkstra演算法
- 9-貪心演算法演算法
- 演算法基礎---二分演算法演算法
- 常用演算法之貪心演算法演算法
- Moving Tables(貪心演算法)演算法
- Python演算法:貪心策略Python演算法
- 貪心演算法與動態規劃的區別演算法動態規劃
- leetcode1552題解【二分+貪心】LeetCode
- 【貪心】【二分】[NOIP2015]跳石頭
- 貪心
- 貪心演算法——換酒問題演算法
- 淺談貪心與動歸
- 程式碼隨想錄演算法訓練營第28天 | 貪心進階演算法
- 加油站問題(貪心演算法)演算法
- 貪心演算法篇——區間問題演算法
- 求最大子陣列(貪心演算法)陣列演算法
- 反悔貪心
- Supermarket(貪心)
- 動態規劃(dynamic programming)與貪心演算法(greedy algorithm)動態規劃演算法Go
- C240817C. 團隊協作:二分答案+貪心
- 演算法---貪心演算法和動態規劃演算法動態規劃
- 《演算法筆記》9. 培養貪心思維、貪心演算法深度實踐演算法筆記
- 貪心演算法之無重疊區間演算法
- 活動選擇問題理解貪心演算法演算法
- 貪心演算法有時也很有用 - hashnode演算法
- 汽車加油問題 SDUT OJ 貪心演算法演算法
- leedcode-分發餅乾(貪心演算法)演算法