codeforce 812CSagheer and Nubian Market(二分查找)

来源:互联网 发布:the rain 久石让 知乎 编辑:程序博客网 时间:2024/06/05 18:34

题目链接:http://codeforces.com/problemset/problem/812/C

写在前面:快期末了,这几天又是忙忙碌碌,但是感觉没做什么事情,好几天了啊。。。。一直没补题,感觉要爆炸,下午来补下吧。

题目大意:题目就是说 有n个货物,你有m元钱,你要用这m元钱在他的规则下买尽量多的货物,第一眼看起来题目很水,但是仔细一想,如果你用朴素的方法一个一个查找的话,肯定就会T掉,所以就可以用到二分查找的方法来优化一下。

个人心得:一般来说,让你寻找合适的值,在看似暴力的情况下,要用二分!!!!

代码:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define ll long longconst 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);    }}


阅读全文
0 0