[Coursera]演算法基礎_Week8_二分與貪心_Q3

yiliu_cr發表於2015-12-14
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

const int N = 25;
int n, h;
int f[N], d[N], t[N]; //f第一個5分鐘釣魚量 d每個5分鐘釣魚減少量 t從i到i+1需要5分鐘個數
int ans;
int each[N]; //採用最優方案是,在i胡的釣魚時間
int tans, teach[N]; //最優釣魚量和各個湖釣魚的時間
int th, tf[N]; //有效釣魚時間和每個5分鐘釣魚量

int main()
{
	int i, j;
	while (cin >> n && n>0)
	{
		cin >> h;
		for (i = 0; i<n; i++)
			cin >> f[i];
		for (i = 0; i<n; i++)
			cin >> d[i];
		for (i = 0; i<n - 1; i++)
			cin >> t[i];

		h *= 12;
		ans = -1;
		for (i = 0; i<n; i++)
		{
			//初始化每次貪心的相關量
			th = h;
			for (j = 0; j<n; j++)
			{
				tf[j] = f[j];
				teach[j] = 0;
			}
			tans = 0;

			//對每一個5分鐘貪心選擇釣魚量最大的湖釣魚
			while (th>0)
			{
				int ind, max;
				ind = 0; max = tf[0];
				for (j = 1; j <= i; j++)
				{
					if (tf[j]>max)
					{
						max = tf[j]; ind = j;
					}
				}
				if (max == 0) //最大的釣魚量為0時將剩餘釣魚時間加到第一個湖上的釣魚時間
				{
					teach[0] += th * 5;
					break;
				}
				else
				{
					teach[ind] += 5;
					tans += tf[ind];
					if (tf[ind] >= d[ind])
					{
						tf[ind] -= d[ind];
					}
					else tf[ind] = 0;
				}
				th--;
			}
			//走過的湖個數為i+2時候的釣魚時間
			if (i != n - 1) h -= t[i];

			//更新最優方案結果
			if (tans>ans)
			{
				ans = tans;
				for (j = 0; j<n; j++)
					each[j] = teach[j];
			}
		}
		//輸出結果
		cout << each[0];
		for (i = 1; i<n; i++)
		{
			cout << ", " << each[i];
		}
		cout << endl;
		cout << "Number of fish expected: " << ans << endl;
		cout << endl;
	}

	return 0;
}
非原創,轉自網路。

相關文章