洛谷P2085 最小函数值
题目描述
有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。
数据范围
n,m<=10000
解题思路
解题思路一
博主是从堆试炼场进入这一题的,刚开始想了不少优先队列解法(一个都没想,看了一眼这个范围,这不是俗话说得好,n方过千万(雾,只要常数写得好这题就能过了。
但是仔细一想有一个问题,空间爆炸。博主这个时候考虑到了一个问题,在最优情况下x只需要枚举到n/m+1就可以(既所有求出函数值不同,抱着多水一点分的想法,博主
将x枚举到了n/m+50,然后过了!!!!!最大测试点还只跑了78ms(无O2优化)。
附上骗分ac代码
#include<bits/stdc++.h> using namespace std; const int Maxn=10010; struct num{ long long val; bool operator <(const num &rhs) const{ return val>rhs.val; } }; struct st{ int a,b,c; }tt[Maxn]; int n,m,cnt=0; priority_queue<num> q; int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;++i){ int a,b,c; scanf("%d %d %d",&a,&b,&c); tt[i].a=a; tt[i].b=b; tt[i].c=c; } for(int j=1;j<=m/n+50;++j) for(int i=1;i<=n;++i){ long long ans=tt[i].a*j*j+tt[i].b*j+tt[i].c; q.push((num){ans}); } while(m--){ printf("%lld ",q.top().val); q.pop(); } return 0; }