Facer帮父亲
题目背景
Facer可是一个孝顺的孩纸呦
题目描述
Facer的父亲是一名经理,现在总是垂头丧气的。
Facer问父亲,怎么啦?父亲说,公司出了点问题啊。
公司管理着N个风景点,每个风景点都有不少人来参观。
可是现在!人民投诉票价太高了,他不得不调整票价
具体来说,第i个景点如果票价是x,来的人数就是max( (ai - bi * x),0 )[收益自己算好伐]
你需要分配每个景点的门票,使得每个景点门票总和不超过k,且最大化收益
求最大的收益
输入输出格式
输入格式:
第一行N , k
接下来N行,每行ai,bi
输出格式:
一行,最大的收益
输入输出样例
说明
样例解释:
景点1票价3,景点2票价1
景点1人数:50 - 3*2 = 44 票价 :3 收益:132
景点2人数 : 40 - 1*1 = 39 票价 : 1 收益:39
总收益171 最大
#include<bits/stdc++.h> #define REP(i, a, b) for(int i = (a); i <= (b); ++ i) #define REP(j, a, b) for(int j = (a); j <= (b); ++ j) #define PER(i, a, b) for(int i = (a); i >= (b); -- i) using namespace std; typedef long long ll; const int maxn=2e6+666; template <class T> inline void rd(T &ret){ char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9'){ ret = ret * 10 + (c - '0'), c = getchar(); } } int n,k,s,t; ll ans; struct node{ ll a,b,x,last; bool operator<(const node& tmp)const{ return a*(x+1)-b*(x+1)*(x+1)-last<tmp.a*(tmp.x+1)-tmp.b*(tmp.x+1)*(tmp.x+1)-tmp.last; } }p[maxn]; priority_queue<node>q; int main(){ rd(n),rd(k); REP(i,1,n){ rd(s),rd(t); q.push(node{s,t,0,0}); } while(!q.empty()&&k--){ node tmp=q.top(); q.pop(); int e=tmp.a*(tmp.x+1)-tmp.b*(tmp.x+1)*(tmp.x+1)-tmp.last; if(e<=0)break; tmp.last+=e; tmp.x++; ans+=e; q.push(tmp); } cout<<ans<<endl; return 0; }