Codeforces Round #657 (Div. 2)C. Choosing flowers

题目大意

有m种花,要买n朵花,然后每种花可以买无数朵。

每朵花有两个权值(a_i)(,b_i),第一次买时价值是(a_i),再次买该种花时价值是(b_i),要使价值和最大。

思路

  • 先看复杂度,题目要求的是在(nlog n)内算出答案。所以我们应该是有二分的操作。

然后根据题意,我们可以读出可能是有某种花会多次选择,这种花的(b)一定是比不选择的(a)要大的。

然后我们去枚举可能的(b),二分(a),找到所有比(b)大的(a)

然后在枚举时判断,选这个(b)的时候是否选择了这个(a),也就是函数中的(j)(x)的关系。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define DOF 0x7f7f7f7f
#define endl '
'
#define mem(a,b) memset(a,b,sizeof(a))
#define debug(case,x); cout<<case<<"  : "<<x<<endl;
#define open freopen("ii.txt","r",stdin)
#define close freopen("oo.txt","w",stdout)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pb push_back
using namespace std;
#define int long long
#define lson rt<<1
#define rson rt<<1|1
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<long long,long long> PII;
const int maxn = 1e5 + 10;

int n,m;
struct node{
    int a,b;
    node(int x=0,int y=0){a=x,b=y;}
    bool operator <(const node x)const {
        return a<x.a;
    }
}e[maxn];

int sum[maxn];

int getx(int x){
    int j=lower_bound(e+1,e+1+m,node(e[x].b,0))-e;
    if(m-j+1>=n)return sum[m-n+1];
    ll res=n-(m-j+1);
    if(j>x){
        return sum[j]+e[x].a+(res-1)*e[x].b;
    }else{
        return sum[j]+res*e[x].b;
    }

}

void solve() {
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        cin>>e[i].a>>e[i].b;
    }
    sort(e+1,e+1+m);
    sum[m+1]=0;
    for(int i=m;i>=1;--i){
        sum[i]=sum[i+1]+e[i].a;
    }
    int ans=0;
    for(int i=1;i<=m;++i){
        ans=max(ans,getx(i));
    }
    cout<<ans<<endl;
}


signed main() {
    int __;
    cin >> __;
//    scanf("%d",&__);
    while(__--) {
        solve();
    }

}

C. Choosing flowers
time limit per test1 second
memory limit per test512 megabytes
inputstandard input
outputstandard output
Vladimir would like to prepare a present for his wife: they have an anniversary! He decided to buy her exactly n flowers.

Vladimir went to a flower shop, and he was amazed to see that there are m types of flowers being sold there, and there is unlimited supply of flowers of each type. Vladimir wants to choose flowers to maximize the happiness of his wife. He knows that after receiving the first flower of the i-th type happiness of his wife increases by ai and after receiving each consecutive flower of this type her happiness increases by bi. That is, if among the chosen flowers there are xi>0 flowers of type i, his wife gets ai+(xi−1)⋅bi additional happiness (and if there are no flowers of type i, she gets nothing for this particular type).

Please help Vladimir to choose exactly n flowers to maximize the total happiness of his wife.

Input
The first line contains the only integer t (1≤t≤10000), the number of test cases. It is followed by t descriptions of the test cases.

Each test case description starts with two integers n and m (1≤n≤109, 1≤m≤100000), the number of flowers Vladimir needs to choose and the number of types of available flowers.

The following m lines describe the types of flowers: each line contains integers ai and bi (0≤ai,bi≤109) for i-th available type of flowers.

The test cases are separated by a blank line. It is guaranteed that the sum of values m among all test cases does not exceed 100000.

Output
For each test case output a single integer: the maximum total happiness of Vladimir's wife after choosing exactly n flowers optimally.

原文地址:https://www.cnblogs.com/waryan/p/13374385.html