欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019中国大学生程序设计竞赛-女生专场(重现赛)-1003 function

程序员文章站 2022-07-15 16:10:43
...

2019中国大学生程序设计竞赛-女生专场(重现赛)-1003 function

 链接:题面链接

破题:

1.看到题面是二次函数以为是数学规律,仔细看下去是到贪心题目,因为数据不大所以可以直接贪;

 

2.因为所有的讨论的 X 都是大于 0 的所以我们就以 1 为出发点,将所有 F(X)中的X设为 1 然后根据 F(x+1)-F(x)的差值来决定最小的贪心。

3.维护 [ F(x+1)-F(x) ]差值 的变化是最重要的因为我们每次选择都是选择最小的;

4.因为n<=m所以在初始 X=1 之后还剩可分配的点数 就只有(M-N)了;

代码:优先队列细节参考链接;

//参考//https://blog.csdn.net/c20182030/article/details/70757660 
#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
struct num{
	int a,b,c;
	int x;
	int cha;
	bool operator<(const num &q)const
	{
		return cha>q.cha;
	}
};
priority_queue<num,vector<num>,less<num> >x;
int main()
{
	int n,m;
	ll ans=0;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		struct num temp;
		cin>>temp.a>>temp.b>>temp.c;
		temp.x=1;
		temp.cha=temp.a*(2*temp.x+1)+temp.b;
		x.push(temp); 
		ans+=temp.a+temp.b+temp.c;
	}
	for(int i=0;i<m-n;i++){
		num t;
		t=x.top();
		x.pop();
		ans+=t.cha;
		t.x++;
		t.cha=t.a*(2*t.x+1)+t.b;
		x.push(t);
	}
	cout<<ans<<endl;
		
}