YTU之挑剔的H胖胖

题目描述

最近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;
}

程序设计基础结课考试中的一道题

发布了36 篇原创文章 · 获赞 4 · 访问量 1407

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/89476486