codeforces 812 C. Sagheer and Nubian Market(二分答案)

来源:互联网 发布:淘宝裂变有危险吗 编辑:程序博客网 时间:2024/06/05 19:34

题意:

n个商品,有s块钱,买第i件商品的价格为a[i]+i*k,a[i]为商品的基础价格,k为总共要买的商品数量,问最多能买多少件商品,在买相同数量的商品情况下,尽量让花的钱最少。


解题思路:

二分枚举要买的商品数量,然后排序一下价格,check是否能买到当前答案数量的商品,求出一个最大值即可。


代码:

#include <bits/stdc++.h>using namespace std;const int maxn=1e5+5;long long a[maxn];long long b[maxn];int main(){    int n, s, i;    long long j;    cin>>n>>s;    for(i=1; i<=n; i++)    {        scanf("%lld", &a[i]);    }    long long l=0, r=n, mid;    long long m, ans=0, sum=0;    for(i=0; i<50; i++)//枚举次数视题目而定    {//        cout<<l<<" "<<r<<endl;        mid=(l+r)>>1;        m=0;        for(j=1; j<=n; j++)        {            b[j]=a[j]+j*mid;        }        sort(b+1, b+n+1);        for(j=1; j<=mid; j++)        {            m+=b[j];            if(m>s)break;        }        if(j<=mid)        {            r=mid-1;        }        else        {            ans=mid;            sum=m;            l=mid+1;        }    }    printf("%lld %lld\n", ans, sum);    return 0;}


阅读全文
0 0