题解分享
题解分享简介
最大开支(编程题) - 题解
```
#include<iostream>
using namespace std;
#include<queue>
typedef long long ll;
ll fun(ll k,ll b,ll x)
{
return k*x*x+b*x;
}
ll delty(ll k,ll b,ll x)
{
return fun(k,b,x+1)-fun(k,b,x);
}
struct node
{
ll k,b,x;
bool operator<(const node& other)const
{
return delty(k,b,x)<delty(other.k,other.b,other.x);
}
};
priority_queue<node> q;
int main()
{
ll sum=0,n,m,k,b;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>k>>b;
q.push(node{k,b,0});
}
for(int i=1;i<=n;i++)
{
node p=q.top();
q.pop();
if(delty(p.k,p.b,p.x)<=0)
{
break;
}
q.push(node{p.k, p.b, p.x + 1});
}
while(q.size())
{
node p=q.top();
q.pop();
sum+=fun(p.k,p.b,p.x);
}
cout<<sum;
return 0;
}
```
查看全文
1
0
1
1
最大开支(编程题) - 题解
优先队列换成数组再排个序也能解
```cpp
// https://dashoj.com/d/lqbproblem/p/121
#include <bits/stdc++.h>
#define N 100010
using namespace std;
typedef long long ll;
ll n, m, ans = 0;
vector<ll> k(N), b(N);
priority_queue<ll> pq;
ll maxx(ll i, ll x) {
return max(x * (k[i] * x + b[i]) - (x - 1) * (k[i] * (x - 1) + b[i]), (ll) 0);
}
int main() {
cin >> n >> m;
for (ll i = 0; i < m; i++) cin >> k[i] >> b[i];
for (ll j = 0; j < m; j++)
for (ll i = 1; i <= n; i++)
if (maxx(j, i)) pq.push(maxx(j, i));
else break;
ll cnt = min(n, (ll) pq.size());
for (int i = 0; i < cnt; i++) {
ans += pq.top();
pq.pop();
}
cout << ans << endl;
return 0;
}
```
查看全文
0
0
1
0



