---
# System prepended metadata

title: TIOJ 誰來三餐-題解

---

# 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 誰來午餐