程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 題解

HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 題解

編輯:C++入門知識

HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 題解


有一組數據是客人到來和離開的時間,問需要多少張桌椅才能滿足所有客人都能有位置坐的要求。

有人居然一開始就想到暴力法,以為數據量少,其實本題數據量不少了, 暴力法需要O(n*n)的時間效率了,顯然是會超時的,故此需要O(n) 或者O(lgn)的算法。

屬於一道想透了就非常容易的,但是沒想過就會非常困難的題目。


解法是:

把所有客人到來和離開的時間都排成序列,每次客人到來需要n張桌椅,那麼就+上n,每次客人離開就會返還n張桌椅,那麼就-去n,求這樣的最大值。

具體算法代碼就那麼幾行,處理IO的代碼都比這個長。要想出來還真是十分困難,不過也算是經典算法了,應該學熟練。


const int MAX_N = 10001;
struct Interval
{
	int t, wei;
	bool operator<(Interval const &i) const
	{
		if (t == i.t) return wei < i.wei;
		return t < i.t;
	}
};

Interval inter[MAX_N<<1];

inline int timeToSec(int h, int m)
{
	return h * 60 + m;
}

int main()
{
	int T, n, h, m, w, num;
	scanf("%d", &T);
	while (T--)
	{
		scanf("%d", &n);
		num = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d %d:%d", &w, &h, &m);
			inter[num].t = timeToSec(h, m);
			inter[num++].wei = w;

			scanf("%d:%d", &h, &m);
			inter[num].t = timeToSec(h, m);
			inter[num++].wei = -w;
		}
		sort(inter, inter+num);
		int ans = 0, tmp = 0;
		for (int i = 0; i < num; i++)
		{
			tmp += inter[i].wei;
			ans = max(tmp, ans);
		}
		printf("%d\n", ans);
	}
	return 0;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved