【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; }
“Make my parents proud,and impress the girl I like.”