洛谷 P2085 最小函数值

来源:互联网 发布:知乎 如何钓鱼 编辑:程序博客网 时间:2024/06/05 20:15

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