dp水题之2424 Flo's Restaurant解题方法

  原题链接:http://poj.org/problem?id=2424

  看到提交的人并不多,通过率也挺低的,无聊至极就把解题报告写一下。本题其实是个十足的水题,千万不要看到一些分类里面说是dp就被吓到。仔细看明白题意思路也就出来了。如果说和dp有点关系的话,那也是就是动态处理这一块,这种题应该就属于送分型的题。摸清题意很重要。

  题目意思就是说餐厅里面有2座、4座和6座的桌子若干。客人按人数选择餐桌,如果需要等半个小时以上,就不吃了。问一共多少人在餐厅用餐。解题的思路很简单,就是每次来客人以后寻找空座,如果没有,就找最快吃完的人。更新时间。如果有空桌,那么这个桌子空下来需要从现在开始再加30分钟,如果没有,而且这个类型的桌子空出一个来最快的世界大于半小时,就离开。如果小于半小时就吃。这个桌子空出来的时间就是现在空出来的时间加上30分钟。求最早空出来直接把每个桌子的时间排序就行,数据量不大,不会超时。

#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;

int main()
{
	int a, b, c, x[101], y[101], z[101], n, sum;
	string s;
	while (cin>>a>>b>>c)
	{
		if (!a && !b && !c)break;
		sum = 0;
		memset(x, 0, sizeof(x));
		memset(y, 0, sizeof(y));
		memset(z, 0, sizeof(z));
		while (cin>>s && s != "#")
		{
			cin>>n;
			int time = ((s[0] - '0') * 10 + s[1] - '0' - 8) * 60 + (s[3] - '0') * 10 + s[4] - '0';
			switch(n)
			{
			case 1:
			case 2:
				sort(x, x + a);
				if (x[0] - time <= 30)
				{
					sum += n;
					if (x[0] < time)x[0] = time;
					x[0] += 30;
				}
				break;
			case 3:
			case 4:
				sort(y, y + b);
				if (y[0] - time <= 30)
				{
					sum += n;
					if (y[0] < time)y[0] = time;
					y[0] += 30;
				}
				break;
			case 5:
			case 6:
				sort(z, z + c);
				if (z[0] - time <= 30)
				{
					sum += n;
					if (z[0] < time)z[0] = time;
					z[0] += 30;
				}
				break;
			default:break;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}
posted @ 2011-02-15 21:46  like@neu  阅读(470)  评论(0编辑  收藏  举报