本来是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;
}