题目描述
最近H胖胖可爱吃东西了,既想吃草莓,又想吃菠萝,还想吃肉夹馍,可是他有点挑剔,想吃的任何东西都有一个最小值(本胖胖最少要这些才不会不高兴),当然也有最大值(给本胖胖过多,本胖胖也不会喜欢的),为了使胖胖的心情值最大,请大家帮帮忙。
输入
现在给出胖胖需要的物品总量N(1<=N<=100)和自身能给的物品总数M(1<=M<=10000),之后N行,每行三个数字k1,k2,k3,k1表示对此物品需要的最小值,k2表示对此物品需求的最大值,k3表示胖胖每得到一个此物品之后的心情值。
输出
输出H胖胖最大的心情值,若能给的物品总数小于H胖胖要求每件物品最小值之和,则输出-1.
样例输入
3 5
1 4 2
1 2 5
2 2 1
样例输出
14
提示
H胖胖想要三个物品,给胖胖三件物品最小值之后心情值是2+5+1*2=9,还剩5-4=1件物品,最后给胖胖第二件物品得到心情值5,则最后的心情值为9+5=14。建议使用结构体,排序使用库函数的快速排序。
C++快速排序使用方式举例:
#include
struct node{
int n1,n2;
}
bool cmp(node n1,node n2){
return n1.n1 > n2.n1; //按照结构体中的n1排序
}
int main(){
node n[100];
sort(n,n+100,cmp);
/*
对结构体node排序,第一个参数是要排序的结构体数组名称(第一个结构体地址),第二个参数是结构体数组第100个结构体地址,cmp是自定义排序方式
*/
}
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
struct node
{
int x;
int y,z;
}q[150];
bool cmp(node z,node y)
{
return z.z > y.z;
}
int main()
{
int n,m;
int i,j,zk=0,qp=0,ans=0;
cin>>n>>m;
for(i=0;i<n;i++)
{
cin>>q[i].x>>q[i].y>>q[i].z;
qp=qp+q[i].x; //qp是用来记录胖胖所需物品的最小值
zk=zk+((q[i].z)*(q[i].x)); //zk是满足所有物品最小值后会得到的快乐值
}
if(m<qp)
{
ans=-1;
}
if(m==qp)
{
ans=ans+zk;
}
if(m>qp)
{
m=m-qp;
ans=ans+zk;
sort(q,q+n,cmp); //按照快乐值从大到小排序
j=0;
while(m>0 && j<n) //注意循环条件中的j<n,否则当提供的m足够大时无法跳出循环
{
int op=q[j].y-q[j].x;
if(m<op)
{
ans=ans+m*q[j].z;
m=0;
}
if(m>=op)
{
ans=ans+(op*(q[j].z));
m=m-op;
}
j++;
}
}
cout<<ans<<endl;
return 0;
}
程序设计基础结课考试中的一道题