首页 > 编程语言 >P1203 [USACO1.1]坏掉的项链Broken Necklace(C++_模拟_暴力枚举_优化)

P1203 [USACO1.1]坏掉的项链Broken Necklace(C++_模拟_暴力枚举_优化)

时间:2023-06-20 10:02:53浏览次数:53  
标签:USACO1.1 int ans ++ C++ Broken 珠子 项链 本位


题目描述

你有一条由 n 个红色的,白色的,或蓝色的珠子组成的项链,珠子是随意安排的。 这里是 n=29 的两个例子:

P1203 [USACO1.1]坏掉的项链Broken Necklace(C++_模拟_暴力枚举_优化)_数据


第一和第二个珠子在图片中已经被作记号。

图片 A 中的项链可以用下面的字符串表示:

brbrrrbbbrrrrrbrrbbrbbbbrrrrb

假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事(颜色可能与在这之前收集的不同)。 确定应该在哪里打破项链来收集到最大数目的珠子。

例如,在图片 A 中的项链中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链可以收集到 8 个珠子。

白色珠子什么意思?

在一些项链中还包括白色的珠子(如图片B) 所示。

当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。

表现含有白珠项链的字符串将会包括三个符号 r,b,w 。

写一个程序来确定从一条被给出的项链可以收集到的珠子最大数目。

输入格式

第一行一个正整数 n ,表示珠子数目。 第二行一串长度为 n 的字符串, 每个字符是 r , b 或 w。

输出格式

输出一行一个整数,表示从给出的项链中可以收集到的珠子的最大数量。

输入输出样例

输入 #1

29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出 #1

11

说明/提示

【数据范围】

对于 P1203 [USACO1.1]坏掉的项链Broken Necklace(C++_模拟_暴力枚举_优化)_割点_02的数据,P1203 [USACO1.1]坏掉的项链Broken Necklace(C++_模拟_暴力枚举_优化)_割点_03

题目翻译来自NOCOW。

USACO Training Section 1.1

思路

就是个模拟问题,枚举每一个分割点,并计数,遇到连续重复的珠子就跳过,优化应该还是蛮大的,虽然这道题数据很水不用优化…(小心各种稀奇古怪的特例,所以code中特判可能有点多,但应该注释里面都写的很清楚了。)

源码

#include<bits/stdc++.h>
using namespace std;
int n, maxx = -1;
string s;
int num(int d)
{
	int ans = 0, temp = d - 1;
	if (d == 0)//特判
		temp = n - 1;//防止溢出
	int t = s[temp];
	for (int i = d - 1;; i--)//从本位的前一位倒着走
	{
		if (i == d)//转了一整圈
		{
			if (s[i] == s[d] || s[i] == 'w')//本位和移动位相同
				ans++;
			return ans;
		}
		if (i == -1)//特判
			i = n - 1;
		if (t == 'w' && s[i] != 'w')//本位的前一位是‘w’
			t = s[i];
		if (s[i] == t || s[i] == 'w')//从前一位开始比较
			ans++;
		else//移动位和本位的前一位不相等
			break;
	}
	t = s[d];
	for (int j = d;; j++)//从本位开始向后走
	{
		if (j == n)//特判
			j = 0;
		if (t == 'w' && s[j] != 'w')//本位是‘w’
			t = s[j];
		if (s[j] == t || s[j] == 'w')//比较本位和下一位
			ans++;
		else
			break;
	}
	return ans;
}
int main()
{

	cin >> n >> s;
	for (int i = 0; i < n; i++)
	{
		if (i != 0 && s[i] == s[i - 1])//优化剪枝
			continue;
		else
			maxx = min(max(maxx, num(i)), n);//记录珠子最多的分割点但不能超过珠子总数
	}
	cout << maxx;
	return 0;
}


标签:USACO1.1,int,ans,++,C++,Broken,珠子,项链,本位
From: https://blog.51cto.com/u_16165815/6520506

相关文章

  • P1582 倒水(C++_数论_进制)
    题目描述一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)显然在某些情况下CC无法达到目标,比......
  • P1478 陶陶摘苹果(升级版)(C++_贪心)
    题目描述又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次他有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在s<0s<0之前最多......
  • CCF_201612-4 压缩编码(C++_区间DP)
    问题描述       给定一段文字,已知单词a1,a2,…,an出现的频率分别t1,t2,…,tn。可以用01串给这些单词编码,即将每个单词与一个01串对应,使得任何一个单词的编码(对应的01串)不是另一个单词编码的前缀,这种编码称为前缀码。使用前缀码编码一段文字是指将这段文字中的每......
  • PAT_Advanced Level_1078 Hashing (25分)(C++_Hush_平方探测法)
    Thetaskofthisproblemissimple:insertasequenceofdistinctpositiveintegersintoahashtable,andoutputthepositionsoftheinputnumbers.ThehashfunctionisdefinedtobeH(key)=key%TSizewhereTSizeisthemaximumsizeofthehashtable.Qu......
  • 数据结构代码整理_队列Queue(C++)
    所谓队列,就是先进先出规则的实现。基于链表实现main.cpp#include<iostream>#include"Queue.h"usingnamespacestd;intmain(){ Queueq; q.append(1); q.append(2); Queue_entrya; q.retrieve(a); cout<<a<<""<<q.empty(); return......
  • PTA_乙级_1001 害死人不偿命的(3n+1)猜想 (C++_数论)
    卡拉兹(Callatz)猜想:对任何一个正整数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹......
  • 数据结构代码整理_栈Stack(C++)
           所谓栈,就是先进后出规则的实现,这种数据结构在DFS等算法体现的较为明显,因为课程要求不得不进行各种数据结构实现代码整理,就发出来与大家分享。下面有两种实现方法一个是基于数组实现的,另一个是基于链表实现的。基于数组实现源码main.cpp//main.cpp:定义控制台应用程......
  • C++使用ranges库解析INI文件
    C++使用ranges库解析INI文件引言C++20引入了<ranges>头文件,C++23对其进行了完善,本文将使用该头文件提供的adaptor编写一个简单的ini解析器。ini文件格式介绍一般的ini文件由section和entry部分,比如[section]key=value;Thisisentry.section和entry均独占一行,其中sectio......
  • C++四种类型转换
    篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++四种类型转换相关的知识,希望对你有一定的参考价值。const_cast主要用于删除变量的const属性,便于赋值constinta=2;int*p=const_cast<int*>(&a);*p=3;reinterpret_cast仅仅是重新解释类型,没有二进制的......
  • C++ 关键字四种cast类型转换
    1.23四种cast类型转换作用:克服c中强制类型转化带来的风险,C++引入四种更加安全的强制类型转换运算符(明确转换的目的,偏于程序的维护和分析)const_cast://1.去除const属性,将只读变为只读写//2.针对常量指针、常量引用和常量对象constchar*p;char*p1=const_cast<char*>(p......