题解 | #小熊吃糖#
小熊吃糖
http://www.nowcoder.com/practice/dc49df3bbc0146dd92322889d40afcb1
#include <iostream> #include <algorithm> using namespace std; const int N=150; int t[N]; struct x { int att; int hungry; int num; }; x xiong[N]; bool cmp(x a,x b) { return a.att>b.att; } bool cmpr(x a,x b)//要定义两个排序函数,因为需要按照nun把熊在排回去,记得这个思想,很方便,不用使用map之类的东西 { return a.num<b.num; } int main() { int n,m;cin>>n>>m; for(int i=0;i<m;i++) { cin>>t[i]; } for(int i=0;i<n;i++) { cin>>xiong[i].att>>xiong[i].hungry; xiong[i].num=i; } sort(t, t+m); sort(xiong, xiong+n,cmp); for(int i=0;i<n;i++) { for(int j=m-1;j>-1;j--) { if(xiong[i].hungry>=t[j]) { xiong[i].hungry-=t[j]; t[j]=300; } } } sort(xiong, xiong+n,cmpr);//注意这个地方 for(int i=0;i<n;i++) { cout<<xiong[i].hungry<<endl; } return 0; }
思路:排序,贪心,模拟。
让熊和糖都排好序后,让战力最强的熊吃最大的那个糖,能吃的话就吃,不能吃的话就看下一个糖,每个熊都遍历一遍,最后注意要把熊再排序回去,因为要按原顺序返回熊的剩余饥饿值,因此要在定义熊的结构体时,重新加上num成员变量。因为这样可以通过num再把熊排序回去。