标签:排队 多少 tin algo eof waiting sizeof txt ant
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2923 | Accepted: 916 |
Description
Input
Output
Sample Input
1 1 1 10:40 1 10:50 2 11:00 4 # 1 1 1 10:40 1 10:50 2 11:00 2 # 1 2 1 10:30 1 10:40 3 10:50 2 11:00 1 11:20 5 # 0 0 0
Sample Output
7 3 12
题目大意: 一家餐厅有a 个两人桌, b 个四人桌, c 个六人桌, 如果一组组人来吃饭, 如果对应的桌子(1, 2人对应两人桌, 以此类推)满的话就等, 如果发现等待超过30分钟就走,
假设每桌人都吃30分钟, 问这家餐馆最终能够招待多少人。
题目分析: 这道题归类是动态规划可我并没有发现, 用模拟做的, 一开始想的很简单, 知道等待队列里超过1人就不排队了(这是错的, 因为有多桌人在吃饭, 可能两桌吃完的间隔小于30分钟,
如果说只有一桌那这种是对的), 看来以后不能想当然啊!这道题的思路就是创建数组记录每桌的离开时间, 然后将排队的人与最早离开时间相比较, 这里有一个小小的trick就是
如果客人到达时发现所有桌都空, 则将客人到达的时间设定为最早桌进入的时间,代码注释中已经说明。
附上代码:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std; int main() { int a, b, c; int x[101]; int y[101]; int z[101]; // freopen( "in.txt", "r", stdin ); while( cin >> a >> b >> c ) { if( !a && !b && !c ) break; memset( x, 0, sizeof( x ) ); memset( y, 0, sizeof( y ) ); memset( z, 0, sizeof( z ) ); string s; int sum = 0; while( cin >> s && s != "#" ) { int n; int time = ( ( s[0] - ‘0‘ ) * 10 + s[1] - ‘0‘ - 8 ) * 60 + (s[3] - ‘0‘) * 10 + s[4] - ‘0‘; cin >> n; switch ( n ) { case 1: case 2: { sort( x, x+a ); // x记录的是所有同一编号桌子的客人的出来时间, x[0]为最早桌出来的时间 if( x[0] - time <= 30 ) { // 等的时间不超过30分钟才排队 sum += n; if( x[0] < time ) x[0] = time; //如果客人到达时发现所有桌都空, 则将客人到达的时间设定为最早桌进入的时间 x[0] += 30; // 最早桌出来的时间存入x[0] } 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; }
自己还是欠练啊, 效率还是不高啊! 加油!
标签:排队 多少 tin algo eof waiting sizeof txt ant
原文地址:http://www.cnblogs.com/FriskyPuppy/p/6001200.html