拼多多2018提前批筆試-伺服器端開發工程師
阿新 • • 發佈:2019-01-24
時間限制: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
*/