【NOIP模拟】买礼物的艰辛

题面

小 X 同学给小 C 同学选了 N 件礼物,决定顺序购买并赠送,但作为一个没有工资没有零花钱的可怜小朋友,有 M 位好心的同学伸出了援助之手,然而为了减少最高的借款量,小 X 同学希望 OI 竞赛的你为他合理规划,使得他能轻松快乐地送出礼物。

30%的数据满足:n≤10;
60%的数据满足:n≤1000;
100%的数据满足:n≤100000

分析

很明显的二分裸题

然而为何机房大佬们惨挂60,连我这等弱鸡也不放过?

有的人是因为排了序,有的是因为细节写挂。我就是上次写一道尺取法(双指针)的题的时候,怎么调都是死循,自闭了

于是这次在死循前多++了一下。然而真的是脑子不清醒,指针已经后移了,根本不需要++。。

大样例太水的锅

代码

#include<bits/stdc++.h>
using namespace std;
#define N 100010
int n,m,l,r,ans,mid,te;
int a[N];
template<class T>
inline void read(T &x)
{
    x=0;int f=1;static char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    x*=f;
}

inline int check(int x)
{
    int i=1,rem=m,now;
    while(i<=n)
    {
        now=0;
        while(now+a[i]<=x)now+=a[i],i++;
        if(rem==0)return 0;
        rem--;//i++;
    }
    return 1;
}
int main()
{
    read(n),read(m);
    for(int i=1;i<=n;i++)read(a[i]),l=max(l,a[i]);
    r=1000000000;
    while(l<=r)
    {
        mid=l+r>>1;
        if(check(mid))
        {
            r=mid-1;
            ans=mid;
        }
        else l=mid+1;
    }
    printf("%d",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/NSD-email0820/p/9909183.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值