[USACO1.1]坏掉的项链Broken Necklace

22892 破碎的项链

方法一:很容易想到枚举断点,再分别两头找,但是要注意很多细节

  1. #include<iostream>
  2. #include<string>
  3. #include<cstdio>
  4. using namespace std;
  5. string s;
  6. int n,l,r,ll,rr,tmp,ans;
  7. inline int calc(int x) {
  8. ll=s[x],rr=s[x+1],l=x-1,r=x+2;
  9. if (rr=='w') {//如果是w,需分类讨论(如10 rwrwbwrwrw,答案为10,去掉后输出9)
  10. rr='r',tmp=x+2;
  11. while((s[tmp]=='w' || s[tmp]==rr) && tmp<x+n) tmp++;
  12. rr='b';
  13. }
  14. while((s[l]=='w' || s[l]==ll) && l>x-n) l--;
  15. while((s[r]=='w' || s[r]==rr) && r<x+n) r++;
  16. return max(r,tmp)-l-1;
  17. }
  18. int main() {
  19. cin>>n>>s;
  20. s=s+s+s;
  21. for (int i=n; i<n+n; i++)//复制了三段,从中间一段枚举断点
  22. if (s[i]!=s[i+1] && s[i]!='w')//当s[i]==s[i+1]时,在i+1计算比在i更优
  23. ans=max(ans,calc(i));
  24. if (s[n+n-1]==s[n+n]) ans=max(ans,calc(n+n-1));//如果都是同一颜色,则最后一个答案没有计算(如3 rrr,去掉min答案就变成0)
  25. printf("%d",min(ans,n));//如果都是同一颜色,则结果不应超过n,(如3 rrr,去掉min答案就变成5)
  26. }

方法二:一边做一边统计答案(思路来自这个博客

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<iostream>
  4. using namespace std;
  5. char s[700],c;
  6. int n,l,r,w,ans;
  7. /*
  8. l:左段长度,r:右段长度
  9. w:连续w段的长度
  10. c:当前段的颜色
  11. */
  12. int main() {
  13. scanf("%d%s",&n,s);
  14. memcpy(s+n,s,n);
  15. for (int i=0; i<n<<1; i++)
  16. if (s[i]=='w') w++,r++;
  17. else if (s[i]==c) w=0,r++;
  18. else ans=max(ans,l+r),l=r-w,r=w+1,w=0,c=s[i];
  19. //这里不能写为l=r,r=1,要把w段给右边,这样在下次修改答案时l更大
  20. //如:bwrrb,遇到第一个r时应当把w给右边,即l=r-w=1,r=w+1=2,这样到第二个b时l更新为3
  21. //而如果用l=r=2,r=1, 第二个b时l更新为2(把开头的w舍去了)
  22. printf("%d",min(max(ans,l+r),n));
  23. }

方法三:dp(思路来自这个博客

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. int n,lb[701],lr[701],rb[701],rr[701],ans;//l[i]不包括i,r[i]包括i
  6. char s[701];
  7. int main() {
  8. scanf("%d%s",&n,s),memcpy(s+n,s,n),n<<=1;
  9. for (int i=1; i<n; i++)
  10. if (s[i-1]=='b') lb[i]=lb[i-1]+1;
  11. else if (s[i-1]=='r') lr[i]=lr[i-1]+1;
  12. else lb[i]=lb[i-1]+1,lr[i]=lr[i-1]+1;
  13. for (int i=n-2; i>=0; i--)
  14. if (s[i]=='b') rb[i]=rb[i+1]+1;
  15. else if (s[i]=='r') rr[i]=rr[i+1]+1;
  16. else rb[i]=rb[i+1]+1,rr[i]=rr[i+1]+1;
  17. for (int i=0; i<n; i++)
  18. ans=max(ans,max(lb[i],lr[i])+max(rb[i],rr[i]));
  19. printf("%d",min(ans,n>>1));
  20. }

题解 P1203 【[USACO1.1]坏掉的项链Broken Necklace】的更多相关文章

  1. P1203 [USACO1.1]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace不错的断环为链的模拟题,开成三倍,有很多细节要考虑,比如总长度要<=n,开头第一个是w等等. #include<bi ...

  2. 洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace

    坏掉的项链Broken Necklace 难度:★ Code: #include <iostream> #include <cstdio> #include <cstri ...

  3. 洛谷P1203 [USACO1.1]坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  4. AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  5. [USACO1.1]坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  6. 【P1203】 【USACO1.1】坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 ...

  7. [USACO1.1.4]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace 标签 搜索/枚举 USACO 难度 普及- 题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N&l ...

  8. USACO Training Section 1.1 坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  9. Broken Necklace 坏掉的项链 USACO 模拟(易错)

    1004: 1.1.4Broken Necklace 坏掉的项链 时间限制: 1 Sec  内存限制: 128 MB提交: 11  解决: 9[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...

随机推荐

  1. Pikachu-敏感信息泄露

    敏感信息泄露概述 由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到. 比如:---通过访问url下的目录,可以直接列出目录下的文件列表;---输入错误的url参数后报错信 ...

  2. 【pattern】设计模式(2) - 模版方法模式

    前言 一晃一年又过了,还是一样的渣. 一晃2周又过去了,还是没有坚持写博客. 本来前2天说填一下SQL注入攻击的坑,结果看下去发现还是ojdbc.jar中的代码,看不懂啊.这坑暂时填不动,强迫在元旦最 ...

  3. Python分布式进程报错:pickle模块不能序列化lambda函数

    今天在学习到廖老师Python教程的分布式进程时,遇到了一个错误:_pickle.PicklingError: Can't pickle <function <lambda> at ...

  4. 【Android休眠】之Android休眠机制

    一.休眠概述 休眠,简而言之就是设备在不需要工作的时候把一些部件.外设关掉(掉电或让它进入低功耗模式). 为什么要休眠呢?一言以蔽之:省电. 休眠分主动休眠和被动休眠.主动休眠:比如我电脑不用了,就通 ...

  5. 【14】Softmax回归

    在下面的内容中,我们用C来表示需要分的类数. 最后一层的隐藏单元个数为4,为所分的类的数目,输出的值表示属于每个类的概率. Softmax函数的具体步骤如下图: 简单来说有三步: 计算z值(4×1矩阵 ...

  6. jquery form表单赋值封装

    ;!(function ($) { $.fn.setFormValue = function (options) { var $this = $(this); $.each(options, func ...

  7. “/Reports”应用程序中的服务器错误。

    “/Reports”应用程序中的服务器错误. ----------------------------------------------------------------------------- ...

  8. 题解【洛谷P1596】[USACO10OCT]Lake Counting

    题面 \(\text{Flood Fill}\) 模板题. \(\text{Flood Fill}\) 可以快速求出一个图中连通块的个数. 大概就是遍历每一个点,如果它没有被遍历过且是一个新连通块,那 ...

  9. Linux C++ 单链表添加,删除,输出,逆序操作

    /*单链表操作*/#include <iostream>using namespace std; class Node{ public: Node(){ next=0; } Node(in ...

  10. Android 基础知识 -- BroadcastReceiver

    BroadcastReceiver 广播,是一种事件传递机制,可以跨应用进行事件传递(系统级). 在使用广播的时候,不宜添加过多的逻辑或者耗时(广播内不允许开辟线程)操作,超过10秒,导致ANR 1 ...