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;
		
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值