codeforce 812C Sagheer and Nubian Market(二分查找)

题目链接: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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值