今天31个省新增最新消息,网站建设优化佛山,建设电动车官方网站,惠州网站制作费用前言
有一个东西卡了我一会 折叠N*或N 正整数集 (由全体正整数组成的集合) N*:{1,2,3,…,n,…} 题目
洛谷P2085 OJ1370 给出n个ai,bi,ci。定义一个函数 fi(x)aix2bixci(x∈N∗)fi(x)aix2bixci(x∈N∗)然后求最小的m个数解题思路
这道题比较简单#xff0c;一下就想到了…前言
有一个东西卡了我一会 折叠N*或N 正整数集 (由全体正整数组成的集合) N*:{1,2,3,…,n,…} 题目
洛谷P2085 OJ1370 给出n个ai,bi,ci。定义一个函数
fi(x)aix2bixci(x∈N∗)fi(x)aix2bixci(x∈N∗)
f_i(x)=a_ix^2+b_ix+ci(x∈N*) 然后求最小的m个数解题思路
这道题比较简单一下就想到了。最重要的是得知道
fi(1)fi(2)fi(3)...fi(n)...fi(1)fi(2)fi(3)...fi(n)...
f_i(1) 然后就开始时都是x1的开一个小根堆然后取最小的输出并且将那个f的x累加。然后维护代码
#includecstdio
#includealgorithm
using namespace std;
struct woc{int ans,ai,bi,ci,xi;//结构体
};
woc a[10001];
int n,m,num;
void up(int x)//维护堆
{while (x1 a[x/2].ansa[x].ans){swap(a[x/2],a[x]);x/2;}
}
void down(int x)//维护堆
{int y;while (x*2num a[x*2].ansa[x].ans || x*21num a[x*21].ansa[x].ans){yx*2;if (y1num a[y].ansa[y1].ans) y;swap(a[y],a[x]);xy;}
}
int main()
{scanf(%d%d,n,m);for (int i1;in;i){num;scanf(%d%d%d,a[num].ai,a[num].bi,a[num].ci);a[num].xi1;a[num].ansa[num].ai*a[num].xi*a[num].xia[num].bi*a[num].xia[num].ci;//求值up(num);//建堆}输入while (m0){printf(%d ,a[1].ans);//输出a[1].xi;//累加xa[1].ansa[1].ai*a[1].xi*a[1].xia[1].bi*a[1].xia[1].ci;//重新求值down(1);//维护堆m--;//减少}
}