小熊喫糖(結構體排序) - 拼多多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
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章