30分,求大佬帮助!

P2985 [USACO10FEB] Chocolate Eating S

```cpp #include<cstdio> #define ll long long //N<=50000 H_i<=1000000 累加起来将超过int范围 using namespace std; const int N=50005; inline ll read() { ll s=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();} return s*f; } ll l,r,mid,ans; ll n,d,a[N],day[N]; inline bool check(ll x) { ll tot=0,sum=0; for(int i=1;i<=d;i++){ sum=sum>>1; //">>1"表示除以2的一次方 while(sum<x){ sum+=a[++tot]; if(tot>n) return false; //达不到检查值x便返回 if(x&&x==ans) day[tot]=i; //if保证仅对ans记录日期 //(当然可以去掉if,不过反复记录非正解很浪费) } } return true; } int main() { n=read();d=read(); for(int i=1;i<=n;i++) a[i]=read(),r+=a[i]; while(l<=r){ mid=(l+r)>>1; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } //二分最低开心值的区间 printf("%lld\n",ans); check(ans); for(int i=1;i<=n;i++){ if(day[i]) printf("%lld\n",day[i]); else printf("%lld\n",d); //最后一个小坑点:在最后一天要吃完剩下的全部巧克力 //“剩下”即未标记过食用日期的巧克力 } return 0; } ```
by smart_ @ 2023-06-09 21:52:36


|