JZOJ 3242. Spacing
题目
分析
- 暴力出奇迹,能过98%??
- 正解
- 最大值最小显然二分
- 再设f[i]表示当前文章右下角的单词是i能否达到目标
- 然后枚举一个j,若j+1~i的这些单词能放进一行并满足要求
- 判断上界下界是否满足
- 就用f[j]更新f[i],最后枚举最后一行放哪些单词更新答案即可。
代码
1 #include <cstdio> 2 #include <iostream> 3 #define N 50010 4 using namespace std; 5 int w,n,ans,mx,p,a[N]; 6 long long sum[N]; 7 bool f[N]; 8 bool check(int x) 9 { 10 f[0]=1,mx=-1,p=0; 11 for (int i=1;i<n;i++) 12 { 13 while (p<i&&sum[i]-sum[p]+x*(i-p-1)>=w) 14 { 15 if (f[p]) mx=p; 16 p++; 17 } 18 f[i]=(mx!=-1&&sum[i]-sum[mx]+i-mx-1<=w); 19 } 20 for (int i=n-1;i>=0;i--) 21 if (f[i]&&sum[n]-sum[i]+n-i-1<=w) 22 return 1; 23 return 0; 24 } 25 int main() 26 { 27 scanf("%d%d",&w,&n); 28 for (int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i]; 29 int l=1,r=w-2; 30 while (l<=r) 31 { 32 int mid=l+r>>1; 33 if (check(mid)) ans=mid,r=mid-1; else l=mid+1; 34 } 35 printf("%d",ans); 36 }
为何要逼自己长大,去闯不该闯的荒唐