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; }