# TIOJ 誰來三餐-題解
## TIOJ-1072 A.誰來晚餐
**Description:**
經過了一整天漫長難熬的上課時間之後,期待了一整天下課的小尹終於能夠暫時逃離課業的轟炸,回到他最喜歡的休閒活動 - 楓之谷的懷抱了!正當小尹迫不及待的連上網路準備大展身手之時,肚子卻不聽使喚的抗議的起來,於是他只好決定先去飽餐一頓回來,晚上才有力氣好好廝殺。
一陣呼朋引伴之後小尹和他的同學們來到了最近的小吃店,每個人選好了菜單上自己想要吃的餐點,正準備要把菜單遞給老闆的時候,小尹卻突然叫大家停了下來,他說:「你看哦,我們有人吃飯快有人吃飯慢,每道菜煮好送上來的時間也不一樣。如果我先吃完,還要等你們吃,又不想拋棄你們自己先回去。那麼如果老闆送菜順序不對的話,我就可能要等很久才能回去玩。最好是我們自己先想好理想的上菜順序,告訴老闆請他照著順序煮菜,才能讓我們大家一起早點回去玩,這樣好不好?」
超有行動力的小尹馬上就開始收集這家小吃店的資訊。他發現這家店很不幸的只有一組廚具,而每份餐點都必須分開來煮,一道煮完才能煮另外一道。而且菜單上每份餐點也都有不同的烹煮時間:例如蛋炒飯可能很快就好了,水餃因為要現包就要等久一點。同時小尹也調查了大家吃飯的速度,估算出每個人吃他所點的餐所需要的時間 (我們假設每個人只有點一份餐)。每份餐點煮好了之後會馬上上桌且立即可食用,而老闆也可以同時緊接著煮下一道菜。小尹身為一個資訊系的學生,有了這些資料之後二話不說就拿出了電腦,想要寫個程式來解決這個問題,可是一時之間卻好像想不到理想的解法。你能幫小尹想個辦法,讓他盡可能早點回到楓之谷的世界嗎?
---
| Input Format | Output Format |
| -------- | -------- |
| 輸入檔包含多組測試資料,每一組測試資料的第一行有一個整數N (1 ≤ N ≤ 10000),代表跟小尹去吃飯的人數,接下來的N行每行有兩個以空白字元分隔的整數Ci Ei ( 1 ≤ i ≤ N, 1 ≤ Ci, Ei ≤ 1000),其中Ci代表烹煮第i個人點的餐點所需要的時間,Ei代表第i個人把他點的餐點吃完所需要的時間。讀到N = 0的時候代表測試檔案的結尾,不需要對於這個數字作任何輸出。 | 對於每一組測試檔,輸出一個正整數在一行內,代表「從老闆開始煮第一道餐點開始,到最後一個人吃完為止,中間一共花了多少時間」,這個數字應該越小越好。 |
---
Sample Input:
3
1 1
2 2
3 3
0
Sample Output:
7
---
**AC code:**
想法:Greedy、Priority_queue基本運用
```cpp=
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define AC ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int main()
{
AC
ll n;
while(cin>>n&&n)
{
ll c,e,r=0,total=0;
priority_queue<pair<ll,ll>> pq;
for(ll i=0;i<n;i++)
{
cin>>c>>e;
pq.push(make_pair(e,c));
}
for(;pq.size();pq.pop())
{
total+=pq.top().second;
r=max(r,total+pq.top().first);
}
cout<<r<<'\n';
}
return 0;
}
```
## TIOJ-1440 誰買早餐
**Description:**
還記得NPSC2005的誰先晚餐以及2007的誰來午餐嗎?
不過這題是誰買早餐。
由於培訓的時間過早,所以大多數參加的人都沒有吃早餐就來參加培訓了。
基於大家的辛勞以及儲備大家的體力,老師決定請大家吃早餐。
但因為每個人的體重不一樣,所以營養需求量也不一樣,一定要吃到營養含量不比自己的需求量低的早餐才能滿足。
老師一大早興沖沖的跑到了早餐部,卻發現每種早餐的營養含量以及價錢都不大一樣,營養越高價錢越高,而且都只剩下一份。
這下老師傷腦筋了,因為他帶的錢並不多,所以他希望花最少錢滿足大家的營養需求量。
(注意:由於公平的問題,每個人只能吃一份早餐)
---
**Input Format && Sample Input**
本題只有一筆測資:
第一行包含一個正整數 n ,代表參加培訓的人數(0 < n <= 1000000)
接下來有 n 行,每行有一個數字 ai,代表每人的營養需求量
第 n+2 行有一個正整數 m ,代表早餐種類的數量(0 < m <= 1000000)
接下來有 m 行,每行有兩個數字bi、ci,代表每份早餐的營養含量以及價錢。
*輸入如下*:
2
5
4
3
7 7
8 8
4 4
**Output Format && Sample Output**
請輸出老師最少要花多少錢,才能滿足大家的營養需求。(我們保證答案在long long int的範圍內)
若無法滿足,請輸出"Impossible."(不含雙引號)
*輸出如下:*
11
---
**AC Code:**
想法:Greedy基礎
```cpp=
#include <bits/stdc++.h>
#define AC ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define s second
#define f first
#define pb push_back
typedef long long int ll;
using namespace std;
bool cmp(pair<ll,ll> k,pair<ll,ll> l) {
return k.s<l.s;
}
int main() {
AC
ll n,m,cnt=0,a,b,c;
vector<pair<ll,ll>> food;
vector<ll> student;
cin>>n;
for(ll i=0;i<n;i++) {
cin>>a;
student.push_back(a);
}
cin>>m;
for(ll i=0;i<m;i++) {
cin>>b>>c;
food.push_back({b,c});
}
sort(student.begin(),student.end());
sort(food.begin(),food.end(),cmp);
ll now=0,money=0;
for(ll i=0;i<m;i++) {
if(food[i].f>=student[now]) {
money+=food[i].s;
now++;
if(now>=n) break;
}
}
if(now<n) cout<<"Impossible.\n";
else cout<<money<<'\n';
return 0;
}
```
## TIOJ-1485 誰來午餐