算法设计与分析实验四-贪心法

【问题1】用i表示x轴上坐标为[i-1,i]的区间(区间长度为1),并给出n个不同的整数,表示n个这样的区间。现在要求画出m条线段覆盖住所有的区间,每条线段可以任意长,要求所画线段长度之和最小。设计算法求这m条线段的最小长度和。

#include <iostream>
#include <vector>
#include<algorithm>

using namespace std;
//Data input
vector<int>vPoint;
int ShortestLine(int m)
{
	vector<int>vGap;
	int n = vPoint.size();
	if (m >= n)
		return n;

	sort(vPoint.begin(), vPoint.end());

	for (int i = 0; i < n - 1; i++)
		vGap.push_back(vPoint[i + 1] - vPoint[i] - 1);
	sort(vGap.begin(), vGap.end());

	int result = vPoint[n - 1] - vPoint[0] + 1;
	int k = vGap.size();
	for (int i = k - 1; i >= k - m + 1; i--)
	{
		if (vGap[i] > 0)
			result -= vGap[i];
	}
	return result;
}
void main(void)
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		int a;
		cin >> a;
		vPoint.push_back(a);
	}
	cout << ShortestLine(m) << endl;
}

【问题2】有n个需要加工的木棍,每个木棍有长度L和重量W两个参数,机器处理第一个木棍用时1分钟,如果当前处理木棍的参数为L和W,如果之后处理的木棍L'≥L并且W'≥W,则不需要额外的时间,否则需要加时1分钟。需要求出给定木棍的最少加工时间。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef struct tagWood
{
	int len;
	int weight;

	bool operator<(const tagWood& w) const
	{
		if (len != w.len)
		{
			return len < w.len;
		}
		else
		{
			return weight < w.weight;
		}
	}
}Wood;

vector<vector<Wood>>vWoodArray;

int ShortestTime(int i)
{
	sort(vWoodArray[i].begin(), vWoodArray[i].end());

	int n = vWoodArray[i].size();

	vector<bool> bDone;
	for (int j = 0; j < n; j++)
	{
		bDone.push_back(false);
	}

	int result = 0;
	for (int j = 0; j < n; j++)
	{
		if (!bDone[j])
		{
			bDone[j] = true;
			int prev = j;
			for (int k = 0; k < n; k++)
			{
				if (!bDone[k] && vWoodArray[i][k].weight >= vWoodArray[i][prev].weight)
				{
					bDone[k] = true;
					prev = k;
				}
			}
			result += 1;
		}
	}
	return result;
}


int main()
{
	int t, n;

	cin >> t;

	for (int i = 0; i < t; i++)
	{
		int n;
		cin >> n;

		vector<Wood>vWood;
		for (int j = 0; j < n; j++)
		{
			Wood w;
			cin >> w.len >> w.weight;
			vWood.push_back(w);
		}

		vWoodArray.push_back(vWood);
	}
	cout << endl;
	
	for (int i = 0; i < vWoodArray.size(); i++)
	{
		cout << ShortestTime(i) << endl;
	}
}
上一篇 下一篇
内容结束