【拼多多】小熊吃糖
阿新 • • 發佈:2019-01-06
連結:https://www.nowcoder.com/questionTerminal/dc49df3bbc0146dd92322889d40afcb1
來源:牛客網
[程式設計題]小熊吃糖
- 熱度指數:838 時間限制:1秒 空間限制:32768K
- 演算法知識視訊講解
有n只小熊,他們有著各不相同的戰鬥力。每次他們吃糖時,會按照戰鬥力來排,戰鬥力高的小熊擁有優先選擇權。前面的小熊吃飽了,後面的小熊才能吃。每隻小熊有一個飢餓值,每次進食的時候,小熊們會選擇最大的能填飽自己當前飢餓值的那顆糖來吃,可能吃完沒飽會重複上述過程,但不會選擇吃撐。
現在給出n只小熊的戰鬥力和飢餓值,並且給出m顆糖能填飽的飢餓值。
求所有小熊進食完之後,每隻小熊剩餘的飢餓值。
輸入描述:
第一行兩個正整數n和m,分別表示小熊數量和糖的數量。(n <= 10, m <= 100) 第二行m個正整數,每個表示著顆糖能填充的飢餓值。 接下來的n行,每行2個正整數,分別代表每隻小熊的戰鬥力和當前飢餓值。 題目中所有輸入的數值小於等於100。
輸出描述:
輸出n行,每行一個整數,代表每隻小熊剩餘的飢餓值。
示例1
輸入
2 5 5 6 10 20 30 4 34 3 35
輸出
4 0
說明
第一隻小熊吃了第5顆糖 第二隻小熊吃了第4顆糖 第二隻小熊吃了第3顆糖 第二隻小熊吃了第1顆糖
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> #include<stdlib.h> using namespace std; struct node { int combat; int hunger; int no; int exclu; }bear[100000]; int n,m; int energy[1000]; int flag[1000]; void work() { for(int i=0;i<n;i++){ int sum=bear[i].hunger; int j=m-1; while(sum){ if(j<0)break; while(j>=0&&energy[j]>sum)j--; if(flag[j]==0){ flag[j]=1; sum-=energy[j]; } j--; } bear[i].exclu=sum; } return ; } int cmp1(node a,node b){ return a.combat>b.combat; } int cmp2(node a,node b){ return a.no<b.no; } int main() { cin>>n>>m; for(int i=0;i<m;i++){ cin>>energy[i]; } for(int i=0;i<n;i++){ cin>>bear[i].combat>>bear[i].hunger; bear[i].no=i; } sort(energy,energy+m); sort(bear+0,bear+n,cmp1); memset(flag,0,sizeof(flag)); work(); sort(bear+0,bear+n,cmp2); for(int i=0;i<n;i++) cout<<bear[i].exclu<<endl; return 0; }