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;
}
浙公网安备 33010602011771号