鏈接: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;
}