题目链接:http://codeforces.com/problemset/problem/812/C
写在前面:快期末了,这几天又是忙忙碌碌,但是感觉没做什么事情,好几天了啊。。。。一直没补题,感觉要爆炸,下午来补下吧。
题目大意:题目就是说 有n个货物,你有m元钱,你要用这m元钱在他的规则下买尽量多的货物,第一眼看起来题目很水,但是仔细一想,如果你用朴素的方法一个一个查找的话,肯定就会T掉,所以就可以用到二分查找的方法来优化一下。
个人心得:一般来说,让你寻找合适的值,在看似暴力的情况下,要用二分!!!!
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn = 1e5+10;
ll a[maxn];
ll b[maxn];
int main()
{
ll n,m;
while(~scanf("%lld%lld",&n,&m)){
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
ll ans=0,l=1,r=n;
while(l<=r){
ll mid=(l+r)>>1;
for(int i=1;i<=n;i++) b[i]=a[i]+i*mid;//按照题目所述的规则进行计算
sort(b+1,b+1+n);
ll sum=0;
for(ll i=1;i<=mid;i++) sum+=b[i];
if(sum<=m){//表示我的钱没有花完或者我的钱刚刚够
ans=mid;//保存答案
l=mid+1;
}
else //表示钱不够花,只能从mid-1里面查找,二分
r=mid-1;
}
for(ll i=1;i<=n;i++) b[i]=a[i]+i*ans;
sort(b+1,b+1+n);
ll sum=0;
for(ll i=1;i<=ans;i++) sum+=b[i];
printf("%lld %lld\n",ans,sum);
}
}