protagonist

Facer帮父亲

题目背景

Facer可是一个孝顺的孩纸呦

题目描述

Facer的父亲是一名经理,现在总是垂头丧气的。

Facer问父亲,怎么啦?父亲说,公司出了点问题啊。

公司管理着N个风景点,每个风景点都有不少人来参观。

可是现在!人民投诉票价太高了,他不得不调整票价

具体来说,第i个景点如果票价是x,来的人数就是max( (ai - bi * x),0 )[收益自己算好伐]

你需要分配每个景点的门票,使得每个景点门票总和不超过k,且最大化收益

求最大的收益

输入输出格式

输入格式:

 

第一行N , k

接下来N行,每行ai,bi

 

输出格式:

 

一行,最大的收益

 

输入输出样例

输入样例#1: 复制
2 4
50 2
40 1
输出样例#1: 复制
171

说明

样例解释:

景点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;
}

 

posted @ 2019-02-21 17:25  czy-power  阅读(159)  评论(0编辑  收藏  举报