Sagheer and Nubian Market

来源:互联网 发布:数据直报系统 编辑:程序博客网 时间:2024/06/07 20:42

题意:
输入纪念品的个数n及你要买的总钱数s,接着输入n个的价钱
因为他买东西是这种的
价钱=a【i】+k*i;
(k表示买了几个)

#include<iostream>#include<queue>using namespace std;priority_queue<long long ,vector<long long >,greater<long long> >q;long long sum,n,m,geshu,jiaqian,a[100001];bool check(long long x){    sum=0;    while(!q.empty())        q.pop();//清空队列    for(long long i=1;i<=n;i++)        q.push(a[i]+x*i);//价钱从a【i】+x*1-a【i】+x*n压入队列    for(long long i=1;i<=x;i++)        sum+=q.top(),q.pop();//从最小的开始加一直加到够个数为止,不能买同一个纪念品        return sum>m?0:1;//如果sum大于价钱的话返回0;没有返回1}int main (){    while(cin>>n>>m)    {        for(int i=1;i<=n;i++)        {            cin>>a[i];        }        long long l=0,r=n;geshu=0;jiaqian=0;        while(l<=r)        {            long long  mid=l+r>>1;//中间的个数,假设能买mid个            bool p=check(mid);            if(p)                geshu=max(geshu,mid),jiaqian=max(jiaqian,sum),l=mid+1;//比较,增大mid的个数            else                r=mid-1;        }        cout<<geshu<<' '<<jiaqian<<endl;    }    return 0;}