Facer帮父亲
by luogu
一开始尝试去dp,发现状态没有办法找完全,于是搂了眼标签
哦,我们可以尝试去化简式子
写道代码里了(没用LATEX
我们考虑一下同一景点中尝试调整一下票价(由于max( (ai - bi * x),0 )代表的是人数,所以就当作)
假如+1,那么变化量:
[(x+1)*ai−(x+1)^2*bi]−[x*ai−x^2*bi]
=ai−bi−2*x*bi
那么我们在开始时判断一下a,b的大小关系,a<b就可以跳了
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+7; //第i个景点收益:(ai-bi*x)*x //(ax-bx^2 ) // 1~n(x_i)<=k int n,k; //int a[N],b[N]; priority_queue< pair<int ,int > >q; int ans; signed main() { ios::sync_with_stdio(false); cin>>n>>k; for(int i=1;i<=n;i++) { int x,y; cin>>x>>y; if(x-y>0) q.push({x-y,y}); } while((k--)&&(!q.empty())) { int x=q.top().first,y=q.top().second; q.pop(); ans+=x; x-=(y<<1); if(x<=0) continue; else q.push(make_pair(x,y) ); } cout<<ans; return 0; }