M - Maratona Brasileira de Popcorn(二分法)

mac2026-08-18  2

题目 思路: 二分法查找答案->满足条件->缩小范围->最优值 AC代码

#include <bits/stdc++.h> using namespace std; int a[100001]; long long n,c,t,maxx; int Find(int l, int r) { while(l<=r) { long long mid=(l+r)/2; long long can=mid*t; long long now=0,ans=1; for(int i=1; i<=n;i++)//自己想出来的方法 { if(a[i]>can){ans=c+1;break;}//结束条件 now+=a[i]; if(now>can){ans++;now=0;i=i-1;} } if(ans<=c) {r=mid-1;maxx=mid;}//ans代表人数 else l=mid+1; } return maxx; } int main() { long long sum=0; cin>>n>>c>>t; for(int i=1; i<=n; i++) { cin>>a[i]; sum+=a[i]; } long long x=Find(1,1e9);//可以用1e9,二分法快 cout<<x<<endl; return 0; }
最新回复(0)