2019中国大学生程序设计竞赛-女生专场(重现赛)-1003 function
程序员文章站
2022-07-15 16:10:43
...
链接:题面链接
破题:
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;
}