关闭

BZOJ4692 Beautiful Spacing

790人阅读 评论(0) 收藏 举报
分类:

考虑先二分答案,然后DP

f[i]表示i能否作为一行的结尾

然后我们考虑i作为结尾时,可以作为这一行开头的单词,一个单词j可以作为这一行的单词,当且仅当slen[i]-slen[j-1]+(i-j)*now>=w&&slen[i]-slen[j-1]+i-j<=m;

其中slen为单词长度的前缀和,w为列数,now为当前二分的答案

所以可以作为当前行开头的单词一定是一段区间,我们可以对区间左右端点分别二分求出,假定求出的区间是[l,r],我们只要判断[l-1,r-1]中有没有可以作为一行结尾的单词即可,可以通过对f作前缀和判断

最后找到能作为最后一行的开头的区间[l,n](二分的时候判断条件稍有不同因为不需要最后一列有字母),然后判断[l-1,n-1]中有没有可以作为结尾的即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 50010
#define MAXM 1010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
int n,m;
int s[MAXN];
int slen[MAXN];
int len[MAXN];
bool OK1(int l,int r,int mx){
	return slen[r]-slen[l-1]+r-l<=m;
}
bool OK2(int l,int r,int mx){
	return slen[r]-slen[l-1]+(r-l)*mx>=m;
}
bool OK3(int x){
	return slen[n]-slen[x-1]+n-x<=m;
}
bool OK(int x){
	int i;
	memset(s,0,sizeof(s));
	s[0]=1;
	for(i=1;i<=n;i++){
		int l=1,r=i-1;
		int L=i,R=0;
		while(l<=r){
			int mid=l+r>>1;
			if(OK2(mid,i,x)){
				R=mid;
				l=mid+1;
			}else{
				r=mid-1;
			}
		}
		l=1,r=i-1;
		while(l<=r){
			int mid=l+r>>1;
			if(OK1(mid,i,x)){
				L=mid;
				r=mid-1;
			}else{
				l=mid+1;
			}
		}
		s[i]=s[i-1];
		if(L<=R&&(L==1||s[R-1]-s[L-2])){
			s[i]++;
		}
	}
	int l=1,r=n;
	int lim;
	while(l<=r){
		int mid=l+r>>1;
		if(OK3(mid)){
			lim=mid;
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
	return s[n]-s[lim-2]||lim==1;
}
int main(){
	int i;
	while(scanf("%d%d",&m,&n)){
		if(!n&&!m){
			break;
		}
		for(i=1;i<=n;i++){
			scanf("%d",&len[i]);
			slen[i]=slen[i-1]+len[i];
		}
		int l=1,r=m-2;
		int ans;
		while(l<=r){
			int mid=l+r>>1;
			if(OK(mid)){
				ans=mid;
				r=mid-1;
			}else{
				l=mid+1;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

/*
11 4
4 2 1 3
5 7
1 1 1 2 2 1 2
11 7
3 1 3 1 3 3 4
100 3
30 30 39
30 3
2 5 3
0 0
*/


0
0
查看评论

Aizu 1333 Beautiful Spacing

这题为某种取最值的dp提供一种解题思路,通过二分,可以使得时间复杂度从n^2降到nlogn。 dp我是倒序做的,定义dp[i]表示从第i个为该行第一个单词时,最大的空格是否小于二分的答案。 再定义两个指针从后往前边做边扫,再弄个前缀和判断指针之间是否有解,再来决定这个第i位的dp值的真假。 #...
  • acerlawson
  • acerlawson
  • 2015-03-24 00:08
  • 174

bzoj 4692: Beautiful Spacing 二分

鏼一道sb题神清气爽。        二分答案后就可以求一个点作为末尾前面一行结尾的范围了吧,然后xjblg就好了。 AC代码如下: #include #include #include #define ll long long #define N 50...
  • lych_cys
  • lych_cys
  • 2016-09-04 19:42
  • 448

UVALive - 6190 Beautiful Spacing [二分+dp判定]

UVALive - 6190 Beautiful Spacing [二分+dp]
  • ACTerminate
  • ACTerminate
  • 2017-10-23 18:32
  • 85

Package to Package Spacing 相关

取消Package to Package Spacing的DRC检测:setup -> constraint -> design constraints -> package to package ->off  ackage to Package Spac...
  • lanmanck
  • lanmanck
  • 2010-05-29 10:55
  • 4521

allegro package to package spacing

板子布局和布线都完成了,DRC report时出现package to package spacing error,由于元件密度问题,元件放得比较近,但实际是没有影响的,于是关闭 package to package spacing 检查,设置 setup->constra
  • winnersun
  • winnersun
  • 2011-09-26 10:50
  • 4441

【ALLEGRO】DRC错误代码

代码 相关对象 说明 单一字符代码 L Line 走线 P Pin 元件脚 V Via 贯穿孔 K Keep in/ou...
  • fengyuwuzu0519
  • fengyuwuzu0519
  • 2018-01-11 10:53
  • 119

关于DICOM Tag(0018,0088) Spacing Between Slices缺失的解决方法

该文由Markdown语法编辑器编辑完成。一、问题提出在读取医学影像序列的Dicom Tag信息时,有几个Tag是与图像的像素信息相关的。如 Pixel Spacing(), Spacing Between Slices()等。 Pixel Spacing是由两个值构成的数组,表明每一张Dico...
  • inter_peng
  • inter_peng
  • 2016-08-02 20:56
  • 1712

苹果开发 笔记(86)Stack View in xcode 7

今天在看storyboard布局的教程的时候,好奇怪Editor 当中 没有了Pin 这个菜单选项,在xcode 7 里面莫名多了一个叫Stack View 这样的东西。查阅一下stackoverflow ,发现这个 Horizontal Spacing 已经取消了。那就郁闷了,本来想勾选两个物体...
  • hero82748274
  • hero82748274
  • 2015-11-01 20:13
  • 2239

HOJ 1983 Beautiful numbers (数位dp)

HOJ 1983 Beautiful numbers (数位dp) 链接:http://acm.hit.edu.cn/hoj/problem/view?id=1983 题意:求范围内的美丽数的个数,美丽数--------能被其每个数位上的数整除。 思路:和dp(一)有点类似,由于要是每位数的倍...
  • ilblue
  • ilblue
  • 2016-10-11 21:08
  • 217

题目1 : Beautiful String

题目来自于hihocoder:http://hihocoder.com/contest/hiho58/problem/1题目1 : Beautiful String 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 We say a string is beautiful...
  • zhouyelihua
  • zhouyelihua
  • 2015-08-14 17:17
  • 1304
    个人资料
    • 访问:234021次
    • 积分:6365
    • 等级:
    • 排名:第4552名
    • 原创:403篇
    • 转载:0篇
    • 译文:1篇
    • 评论:129条
    最新评论