话说这是我写的第一篇题解,哪里不好还望大家多多指教
背景:
本人正在学编程,刚好学到优先队列,教材上有这道题。想来想去,想疯了,还没想出来,于是乎,我就去看题解,结果才发现大佬们写的题解真不是我一萌新理解得了的。我只能说:讲的真好,听得我云里雾里的。
![本人看完题解状态:]
然后,我就做对了题。(~~自然不会是抄题解的了~~)
------------
正文开始:
首先读题:
要求算前m个最小的值,而有n个方程,所以说,如果每个方程的x都从1到n枚举一遍,时间复杂度O(n,m),自然会是大家第一个想到的想法了。
然而n,m<=10000
但是,我们要明白,如果x为一个数时,所有f(x)都不在前m
小的值之内的话,再向后继续算(即继续增加x的值)也不会得到前m小的值了。
这一下不就解决了TLE的问题了?
于是乎,干货来了
cpp
bool flag=false;
for(int j=1;j<=n;j++)
{
int s=hs(a[j],i);
if(ans.size()<m)//未满前m个值
{
ans.push(s);
flag=true;
}
else
{
if(s<ans.top())//可以挤进前m个值
{
ans.pop();
ans.push(s);
flag=true;
}
}
}
if(!flag)//当x为i时没有值能挤进前m个了,break。
break;
这便是判断当x的值为i时,对n个方程算f(x)的代码了
全部的代码如下:
cpp
#include <bits/stdc++.h>
using namespace std;
struct hang//存储1个方程
{
int a,b,c;
};
int hs(hang k,int x)//计算
{
return k.a*x*x+k.b*x+k.c;
}
int main()
{
priority_queue<long long> ans;
priority_queue<long long,vector<long long>,greater<long long> > px;
int n,m;
cin>>n>>m;
hang a[n+1];
for(int i=1;i<=n;i++)
cin>>a[i].a>>a[i].b>>a[i].c;
for(int i=1;i<=m;i++)
{
bool flag=false;
for(int j=1;j<=n;j++)
{
int s=hs(a[j],i);
if(ans.size()<m)
{
ans.push(s);
flag=true;
}
else
{
if(s<ans.top())
{
ans.pop();
ans.push(s);
flag=true;
}
}
//cout<<
//cout<<ans.top()<<endl;
}
if(!flag)
break;
}
for(int i=1;i<=m;i++)
{
px.push(ans.top());
//cout<<ans.top()<<" ";
ans.pop();
}
for(int i=1;i<=m;i++)
{
cout<<px.top()<<" ";
px.pop();
}
return 0;
}
最后说一句,萌新写题解不易,望大家多多支持!谢谢大家