标签:node 函数 val 队列 long hdu6546 增量 include 贪心
题意:有 n 个二次函数 F(x)=ax^2+b*x+c;
现在他想在x1+x2+.....+xi+...xn=m 且 x 为正整数的条件下求出 所有函数值之和的最小值。
请求出这个最小值。
m是大于等于n的,也就是说,肯定有一些函数的x必须比1大
那么为了使所有的函数值之和最小,就必须要考虑怎么分配x
最重要的就是,对于一个二次函数f(x),当它增加1的时候,函数值增加了a*(2x+1)+b,即f(x+1)-f(x)
那么就先把所有的函数的x都赋值1,然后再把增量最小的函数的x加一,并且更新这个函数的增量
用优先队列对结构体排序,每次取出增量最小的
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
long long av,bv,cv,val,x;
bool operator <(node a)const
{
return val>a.val;//按照增量从小到大排序
}
};
node f[100005];
priority_queue<node>q;
int main()
{
long long n,m,sum,i,a,b,c;
while(scanf("%lld%lld",&n,&m)==2)
{
sum=0;
for(i=0;i<n;i++)
{
scanf("%lld%lld%lld",&f[i].av,&f[i].bv,&f[i].cv);
f[i].x=1;
f[i].val=3*f[i].av+f[i].bv;
q.push(f[i]);
sum+=(f[i].av+f[i].bv+f[i].cv);//初始化
}
m-=n;//还要增加m-n次
while(m--)
{
node temp=q.top();
q.pop();
sum+=temp.val;//加上这次的增量
temp.x++;
temp.val=temp.x*temp.av*2+temp.av+temp.bv;//更新下次增量
q.push(temp);//再重新放进队列
}
printf("%lld\n",sum);
}
return 0;
}
标签:node,函数,val,队列,long,hdu6546,增量,include,贪心 来源: https://blog.csdn.net/qq_43552826/article/details/99342980
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。