今天继续刷牛客真题,小熊吃糖。
分析:
刚开始以为每只小熊需要吃饱,可以吃剩,结果发现是每只小熊选择一个最大的可以尽量吃饱的糖,但是不能吃撑。也就是选择糖的时候的是糖的分量要小于或等于饥饿值。因此,需要对糖果的分量进行排序,并按照战斗力排序好的小熊进食。
初始:按照小熊的战斗力进行排序;按照糖的分量进行排序;
选择:根据小熊的饥饿度,选择饥饿度大于等于糖的分量的糖进食,如果饥饿值小于所有糖的分量,那么轮到下一个小熊进食;
终止:根据初始小熊的顺序进行输出饥饿值。
问题:
1、理解题目意思很重要;
2、Python中key的使用和lambda的使用;
附上C++代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct Bear
{
int fight;
int hunger;
int num;
};
bool fun1(Bear b1,Bear b2)
{
if(b1.fight>b2.fight)
return true;
else
return false;
}
bool fun2(int a,int b)
{
if(a>b)
return true;
else
return false;
}
bool fun3(Bear b1,Bear b2)
{
if(b1.num<b2.num)
return true;
else
return false;
}
int main()
{
int bearN,candyN,candytemp;
cin>>bearN>>candyN;
vector<int> candy(candyN);
for(int i=0;i<candyN;i++)
{
cin>>candytemp;
candy[i]=candytemp;
}
vector<Bear> bears(bearN);
for(int j=0;j<bearN;j++)
{
Bear temp;
cin>>temp.fight>>temp.hunger;
temp.num=j;
bears[j]=temp;
}
sort(bears.begin(),bears.end(),fun1);
sort(candy.begin(),candy.end(),fun2);
for(int i=0;i<bearN;i++)
{
int index=0;
while(index<candyN)
{
if(bears[i].hunger>=candy[index])
{
bears[i].hunger=bears[i].hunger-candy[index];
candy[index]=0;
}
index++;
}
}
sort(bears.begin(),bears.end(),fun3);
for(auto c:bears)
{
cout<<c.hunger<<endl;
}
return 0;
}
附上Python代码:
def eatsugar(n,m,sugar,bear):
sugar=sorted(sugar,reverse=True)
for item in sorted(bear.items(),key=lambda x:x[1],reverse=True):
for i in range(m):
if item[1][1]>=sugar[i]:
item[1][1]=item[1][1]-sugar[i]
sugar[i]=0
for i in range(n):
print(bear[i][1])
if __name__=="__main__":
n,m=map(int,input().split())
sugar=list(map(int,input().split()))
bear={}
for i in range(n):
f,h=map(int,input().split())
bear[i]=[f,h]
eatsugar(n,m,sugar,bear)