洛谷 P2085 最小函数值

本文解析了一道通过贪心算法优化求解的模拟考试题目,介绍了暴力算法和贪心算法两种解决方案,最终实现了时间复杂度为O(n*m)的高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来是8.3 模拟考 因为昨天沈阳蜜汁暴雨预警 导致变成8.4模拟考微笑

第一题

因为a,b,c都为正整数

所以 

对称轴一定在原点左侧而且在x正半轴上单调递增 

因此 不要想太多 不需要考虑原点位置问题= . =

再见



首先是暴力算法 时间复杂度(nmlog(mn))

将n个函数从1==》m的值全部求出

再神奇地用sort排序输出前m个


微笑微笑微笑


接下来是n*m算法

这题优化的思想是贪心

即求出每一个函数当前的最优解 之间相互比较 

然后 将取出最优解的那个函数的未知数值+1 接着进行下一次比较 

这样做的好处是是每一步取最优解 只需要比较m*n次即可

其实这道题好像还可以使用最小堆=。=

只不过我不会用再见

代码如下

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
int ans[1000005];
int res[10005];//每个函数当前的最小值 
int sum=0x3f3f3f,big;
int a[10005];
int b[10005];
int c[10005];
int len[10005];
int main()
{
	freopen("minval.in","r",stdin);
	freopen("minval.out","w",stdout);
	memset(ans,0,sizeof(ans));
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&a[i],&b[i],&c[i]);
		len[i]=1;//代表未知数大小 
	}
	for (int k=1;k<=n;k++)
	{
		res[k]=a[k]*len[k]*len[k]+b[k]*len[k]+c[k];
	}
	for (int j=1;j<=m;j++)
	{
		for (int i=1;i<=n;i++)
		{
			if (sum>res[i])
			{
				big=i;//标记最小值所在函数方便操作 
				sum=res[i];
			}
			if (i==n)
			{
				len[big]++;//更新未知数大小 
				res[big]=a[big]*len[big]*len[big]+b[big]*len[big]+c[big];
				//更新函数的值 
				ans[j]=sum;
				big=0;
				sum=0x3f3f3f;
			}
			
		}
	}
	for (int d=1;d<=m;d++)
	{
		printf("%d ",ans[d]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值