HDU 1051 Wooden Sticks 貪心

http://acm.hdu.edu.cn/showproblem.php?pid=1051

題目大意:

給定一些木棒的長和重,安裝第一根木棒時間爲1分鐘,然後如果安裝的上一支木棒的長和重均不超過下一支木棒的長和重,那麼不需要安裝時間,否則要1分鐘。

求最短的安裝時間。

如:(4,9), (5,2), (2,1), (3,5), and (1,4)

按照(1,4), (3,5), (4,9), (2,1), (5,2) 只需要2分鐘。(第一根1分鐘,之後(4,9)轉到(2,1)還需要1分鐘)



思路:

我是去練DP的啊啊啊啊,一看就知道是貪心。想半天DP不出來也沒看到誰用DP的。QAQ

廢話不多說,排個選取的時候向後找,直到找不到沒安裝的木棒爲止。

複雜度O(n^2)



#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 5000;
struct wooden{
	int L, W;
	bool operator <(const wooden& x)const{
		if (L == x.L)
			return W < x.W;
		return L < x.L;
	}
}a[MAXN];
int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		int n;
		scanf("%d", &n);
		for (int i = 0; i < n; i++)		
			scanf("%d%d", &a[i].L, &a[i].W);
		
		sort(a, a + n);
		bool used[MAXN] = { 0 };
		int ans = 1;
		for (int i = 0; i < n; i++)
		{
			if (used[i])	continue;
			used[i] = true;
			int L=a[i].L, W=a[i].W;
			for (int j = i + 1; j < n; j++)
			{
				if (used[j])	continue;
				if (a[j].W >= W && a[j].L >= L)
				{
					used[j] = true;
					L = a[j].L;
					W = a[j].W;
				}
			}

			bool find = false;
			for (int j = i + 1; j < n; j++)
			{
				if (!used[j])
				{
					find = true;
					break;
				}
			}
			if (!find)
				break;
			ans++;
		}
		printf("%d\n", ans);
	}
	return 0;
}


發佈了322 篇原創文章 · 獲贊 15 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章