UVA - 11920 0 s, 1 s and ? Marks

Description

 0 s, 1 s and ?

Marks 

Given a string consisting of 0, 1 and ?

only, change all the
? to 0/1, so that the size of the largest group is minimized. A group is a substring that contains either all zeros or all ones.

Consider the following example:

0 1 1 ? 0 1 0 ?

?

?

We can replace the question marks (?) to get

0 1 1 0 0 1 0 1 0 0

The groups are (0) (1 1) (0 0) (1) (0) (1) (0 0) and the corresponding sizes are 1, 2, 2, 1, 1, 1, 2. That means the above replacement would give us a maximum group size of 2. In fact, of all
the 24 possible replacements, we won‘t get any maximum group size that is smaller than 2.

Input

The first line of input is an integer T (T5000) that indicates
the number of test cases. Each case is a line consisting of a string that contains
0, 1 and ?

only. The length of the string will be in the range [1,1000].

Output

For each case, output the case number first followed by the size of the minimized largest group.

Sample Input

4
011?010?

??
???
000111
00000000000000

Sample Output

Case 1: 2
Case 2: 1
Case 3: 3
Case 4: 14

题意:给定一个带问号的01串,把每一个问号替换成0或1。让最长的“连续的同样数字串”尽量短

思路:最大的最小採用二分。至于推断的时候,每一个位置要么是0要么是1,依据情况推断

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;

int dp[maxn][2];
char str[maxn];
int n;

int check(int len) {
	dp[0][0] = dp[0][1] = 0;
	for (int i = 1; i <= n; i++) {
		dp[i][0] = dp[i][1] = -1;
		if (str[i] != ‘0‘) {
			if (dp[i-1][0] >= 0)
				dp[i][1] = 1;
			if (dp[i-1][1] >= 0 && dp[i-1][1]+1 <= len && dp[i][1] == -1)
				dp[i][1] = dp[i-1][1] + 1;
		}
		if (str[i] != ‘1‘) {
			if (dp[i-1][1] >= 0)
				dp[i][0] = 1;
			if (dp[i-1][0] >= 0 && dp[i-1][0]+1 <= len && dp[i][0] == -1)
				dp[i][0] = dp[i-1][0] + 1;
		}
		if (dp[i][1] == -1 && dp[i][0] == -1)
			return 0;
	}
	return 1;
}

int main() {
	int t, cas = 1;
	scanf("%d", &t);
	while (t--) {
		scanf("%s", str+1);
		n = strlen(str+1);
		int l = 1, r = n;
		while (l <= r) {
			int m = l + r >> 1;
			if (check(m))
				r = m-1;
			else l = m + 1;
		}
		printf("Case %d: %d\n", cas++, l);
	}
	return 0;
}
时间: 2024-10-10 01:01:19

UVA - 11920 0 s, 1 s and ? Marks的相关文章

UVA 624 (0 1背包 + 打印路径)

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<algorithm> #define N 1010 using namespace std; int dp[N], path[N][N], w[N]; int main() { int v, n; while(~scanf("%d", &v)) { sca

UVa 127 - &quot;Accordian&quot; Patience POJ 1214 链表题解

UVa和POJ都有这道题. 不同的是UVa要求区分单复数,而POJ不要求. 使用STL做会比较简单,这里纯粹使用指针做了,非常麻烦的指针操作,一不小心就错.调试起来还是非常费力的 本题理解起来也是挺费力的,要搞清楚如何模拟也不容易啊,读题要很仔细. 纯指针的操作挺快的吧.不过POJ 0ms,而UVa就0.2左右了. 三相链表: 1 只要有叠起来的牌,那么就使用一个down指针指向下面的牌就可以了. 2 使用双向链表,可以方便前后遍历. 3 记得有了更新牌之后,又要重新开始检查是否需要更新牌,这是

Codeforces Round #424 (Div. 2) A-C

A. Unimodal Array 水题 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <iomanip> #include <math.h> #include <map> using namespace

实时阴影渲染(二):软阴影

软阴影是通过对阴影图进行多次采样实现的 因为多个片段经常会对应同一个阴影纹理像素,单次采样会产生严重的锯齿问题 另外软阴影还可以产生比较柔和的边界,看起来比较自然 锯齿产生的原因 仔细思考阴影锯齿产生的原因,可以想到多个片段对应同一个阴影像素时,其在该阴影像素中对应的的位置是不同的 如下示意图,黑色的大方格表示单个阴影纹理像素,虚线分割的部分表示对应到该阴影像素的9个片段 显然对于AB来说其阴影值和C应该是不同的,算法中应该把这个因素考虑进去 可以想到,当纹理坐标没有对应到正中心时,通过与相邻像

【C++】虚函数

I 动态绑定.多态.虚函数.对象的静态类型与动态类型 1.基类中有两种函数: 派生类直接继承不做改变 派生类重新定义成适合自身的版本覆盖掉基类的函数 对于第一种就是普通的基类成员public/protected函数,第二种通常通过将该函数定义为虚函数来实现. 2.对于基类对象的引用或指针,由于继承关系会有两种不同的类型: 静态类型:指针或引用定义时的类型 动态类型:指针或引用实际指向的对象类型 对于对象的引用或者指针,可以实现从派生类向基类的类型转换,以下代码是合法的: class Base{

hdu 4753 2013南京赛区网络赛 记忆化搜索 ****

看到范围基本可以想到dp了,处理起来有点麻烦 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<cmath> 10 #inc

【算法设计与分析基础】11、广度优先遍历

package cn.xf.algorithm.ch03; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Queue; import org.junit.Test; /** * * 功能:广度优先遍历 * @author xiaofeng * @date 2017年5月21日 * @fileName BFS.java * */ public class BFS { public void brea

devices-list

转自:https://www.kernel.org/pub/linux/docs/lanana/device-list/devices-2.6.txt LINUX ALLOCATED DEVICES (2.6+ version) Maintained by Torben Mathiasen <[email protected]> Last revised: 25 January 2005 This list is the Linux Device List, the official regi

Java7编程高级进阶学习笔记

第1章Java简介 1:为什么使用Java 1:java 诞生时C++太费电脑资源,不方便嵌入式移植 2:java 编写一次到处运行 2:什么是Java java 是一门编程语言,移除了内存管理.安全性这类复杂的特性,转而将这些任务交给了虚拟机管理. 3:Java虚拟机 java编译器将java源程序编译成二进制"伪CPU指令构成"的字节码.Java虚拟机仿真了虚拟CPU,为java可执行文件提供了运行环境.字节码解释器.验证器.其中验证器用于内存 管理.线程管理等其他用途.JVM本质