题意:
输入纪念品的个数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;
}