rh123 题解分享 · 2025/1/14
最大开支(编程题) - 题解
``` #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
yuri01 题解分享 · 2025/2/4
最大开支(编程题) - 题解
优先队列换成数组再排个序也能解 ```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