1. 程式人生 > >拼多多2018提前批筆試-伺服器端開發工程師

拼多多2018提前批筆試-伺服器端開發工程師

時間限制:1S
記憶體限制:32768K

題目描述:
有n只小熊,它們有著各不相同的戰鬥力。每次它們吃糖時,會按照戰鬥力來排,戰鬥力高的小熊有優先選擇權。前面的小熊吃飽了,後面的小熊才能吃。每隻小熊有一個飢餓值,每次進食的時候,小熊們會選擇最大的能填飽自己當前飢餓值的那顆糖來吃,可能吃完沒飽會重複上述過程,但不會選擇吃撐。
現在給出n只小熊的戰鬥力和飢餓值,並且給出n顆糖能填飽的飢餓值。
求所有小熊進食完之後,每隻小熊剩餘的飢餓值。

輸入
第一行2個正整數n和m,分別表示小熊和糖的數量。(n<=10, m<=100)
第二行m個正整數,表示每顆糖能填充的飢餓值。
接下來n行,每行2個正整數,分別表示小熊的戰鬥力和當前的飢餓值。
題目中所有的輸入數值小於等於100。

輸出
輸出n行,每行一個整數,代表每隻小熊當前的飢餓值。

樣例輸入
2 5
5 6 10 20 30
4 34
3 35
樣例輸出
4
0

Hint
第一隻小熊吃了第5顆糖
第二隻小熊吃了第4顆糖
第二隻小熊吃了第3顆糖
第二隻小熊吃了第1顆糖

解題思路:結構體排序,小熊按照的戰鬥力排序,糖按照能夠填充的飢餓值排序,然後遍歷一遍!輸出的時候注意要按原小熊順序輸出,否則只過40%資料。

#include <iostream>
#include <algorithm>
using namespace std;

typedef struct
{ int power, hungry, id; }A; bool cmp1(const A& a, const A& b) { return a.power>b.power; } bool cmp2(const A& a, const A& b) { return a.id<b.id; } int main() { int n, m; int b[105]; A a[11]; while(cin >> n >> m) { for(int i = 0
; i < m; ++i) cin >> b[i]; for(int i = 0; i < n; ++i) { cin >> a[i].power >> a[i].hungry; a[i].id = i; } sort(a, a+n, cmp1); sort(b, b+m); for(int i = 0; i < n; ++i) for(int j = m-1; j >= 0; --j) { if(b[j]<=0) continue; if(b[j]<=a[i].hungry) { a[i].hungry-=b[j]; b[j] = -1; } } sort(a, a+n, cmp2); for(int i = 0; i < n; ++i) cout << a[i].hungry << endl; } return 0; } /* 2 5 5 6 10 20 30 4 34 3 35 */