zcmu 1577 食堂的蛋餅(思維)
【題目】
1577: 食堂的蛋餅
Time Limit: 1 Sec Memory Limit: 128 MB Submit: 52 Solved: 10 [Submit][Status][Web Board]
Description
早飯吃什麼,這是一個深奧的問題。學校貌似好吃的也就一個雞蛋餅,然而學校的蛋餅經常供不應求,就算排在隊伍第一無奈蛋餅還在鍋裡,還是要等,但是站著第(mao)一(keng)不買(la)早(shi)飯是不行的,所以阿姨會讓後面的買包子不買蛋餅的同學先來買,等蛋餅出鍋了在按正常的隊伍賣早飯,一旦蛋餅不夠則優先讓買包子的買。愛睡懶覺的小明總是來得較晚所以他想知道他如果他來買早飯大概需要排多久的隊伍,好知道會不會遲到。
假設食堂只有一個視窗,從6.30開始供應,初始蛋餅有10個,包子無限量,大廚每隔10分鐘可以做出10個蛋餅,因為蛋餅暢銷所以大廚一直在做,若供應量夠則每個學生需要花費1分鐘來完成購買。我們已知今天買早飯的N個學生來的時間ti和買早飯的種類ki(1表示蛋餅,2表示包子)以及數量si(每個學生只買一種不會同時買包子和蛋餅),現在給出小明來買早飯的時間,種類和數量,請幫忙計算需要排多久的隊伍。
Input
多組測試資料
第一行包括買早飯的人的數量n(1<=n<=180)
接下來有n行,每行三個資料ti(06:00<=ti<=09:00),ki(1或2),si(1<=si<=100)分別表示來買的人時間種類以及數量,最後一行則表示來的是小明(保證時間沒有重複)。
Output
輸出小明買好早飯的時間,格式參照輸入時間
Sample Input
5 06:30 1 2 06:32 2 4 06:31 1 3 06:33 1 5 06:34 1 1
Sample Output
06:41
【題意】
給定n個人到食堂的時間和早餐的選擇和數量,最後一行輸入小明的資料,輸出小明買好早飯的時間。
早餐從6.30開始供應,初始蛋餅有10個,每隔10分鐘做出10個蛋餅,而包子無限量。一個學生需要花費1分鐘來完成購買。
【思路】
首先,我們需要考慮到給定的時間不一定有序,所以定義一個結構體存資料並按照時間升序排序。其次,考慮到可能會有在小明之前到食堂買蛋餅的同學面臨供應量不足的尷尬,我們需要定義一個vector容器儲存等待的同學,並且讓買包子的同學優先購買。最後,我們按照時間順序處理一個個來買早餐的同學,每十分鐘增加十個蛋餅,若供應量充足則順延,否則記錄狀態使得後邊買蛋餅的同學不能優先購買,如果處理到小明就跳出迴圈~
昨天看了題之後腦子亂亂的,有點思路但是實現起來有點困難。今天看了學長的程式碼,按照時間處理就使得程式碼實現起來相當清晰,哲神就是強。
【程式碼】
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define Pi acos(-1)
#define eps 1e-8
using namespace std;
typedef long long int ll;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
struct p{
int t,k,s,id;
}f[200];
bool cmp(p a,p b)
{
return a.t<b.t;
}
main()
{
int n;
while(~scanf("%d",&n))
{
int x,y;
vector <p> vec;
go(i,1,n)
{
scanf("%d:%d%d%d",&x,&y,&f[i].k,&f[i].s);
f[i].t=x*60+y; f[i].id=i;
}
sort(f+1,f+n+1,cmp);
int sum=0,l=1;
go(i,390,24*60)
{
if(i%10==0) sum+=10;
while(i>=f[l].t&&l<=n) vec.push_back(f[l++]);
if(vec.size())
{
int f=0;
go(j,0,vec.size()-1)
{
if(vec[j].k==2)
{
if(vec[j].id==n)
{
printf("%02d:%02d\n",(i+1)/60,(i+1)%60);
goto out;
}
vec.erase(vec.begin()+j);
break;
}
else if(vec[j].k==1&&f==0)
{
f=1;
if(sum>=vec[j].s)
{
if(vec[j].id==n)
{
printf("%02d:%02d\n",(i+1)/60,(i+1)%60);
goto out;
}
sum-=vec[j].s;
vec.erase(vec.begin()+j);
break;
}
}
}
}
}
out:;
}
}