zoukankan      html  css  js  c++  java
  • 少女觉

    题目

    在幽暗的地灵殿中,居住着一位少女,名为古明地觉。
    据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力——读心。
    掌控人心者,可控天下。
     
    咳咳。
    人的记忆可以被描述为一个黑块(B)与白块(W)的序列,其中情感值被定义为序列中黑块数量与白块数量之比。
    小五口在发动读心术时,首先要解析人的记忆序列,因此,需要将序列分割为一些段,并且要求每一段记忆序列的情感值都相等。
    下面给出两个例子:
    BWWWBB -> BW + WWBB (Ratio=1:1)
    WWWBBBWWWWWWWWWB -> WWWB + BBWWWWWW + WWWB (Ratio=3:1)
    现在小五手上有一个人的记忆序列,她想要知道,如何将手中的记忆序列分成尽可能多的段呢?

    输入

    第一行包含一个正整数T,代表数据组数。
    对于每一组测试数据,第一行包含一个正整数N。
    接下来N行描述一个序列,每行包含一个正整数K和一个大写字母C,表示序列接下来有连续K个颜色为C的方块。

    输出

    对于每组测试数据输出一行一个正整数,表示最多分成的段数。

    样例

    3
    3
    1 B
    3 W
    2 B
    4
    3 W
    3 B
    9 W
    1 B
    2
    2 W
    3 W
     
    2
    3
    5

    数据范围

    对于10%的数据,n<=15
    对于20%的数据,n<=500
    另有30%的数据,K=1
    另有30%的数据,K<=50
    对于100%的数据,N<=10^5,序列长度不超过10^9
    保证对于全部测试点,输入文件行数不超过2.5*10^6

    解法

    贪心

    因为我们知道整个序列W的个数和B的个数的比等于分出来每一段的个数比,

    所以可以暴力把n扫一遍,如果满足整个序列W的个数和B的个数的比等于这一段的个数比,ans++

    #include<cstdio>
    using namespace std;
    int k[300010];
    char ch[300010];
    int main()
    {
          freopen("silly.in","r",stdin);
          freopen("silly.out","w",stdout);
        int t;
        scanf("%d",&t);
        while (t--)
        {
            int n,tot=0,tot1=0;
            scanf("%d",&n);
            for (int i=1;i<=n;i++)
            {
                scanf("%d %c",&k[i],&ch[i]);
                if (ch[i]=='B') tot+=k[i];
                if (ch[i]=='W') tot1+=k[i];    
            }
            if (!tot||!tot1) //需要特判,全是W或B的情况
            {
                printf("%d
    ",tot+tot1);
                continue;
            }
            int sum1=0,sum2=0,ans=0;
            for (int i=1;i<=n;i++)
            {
                int l;
                if (ch[i]=='B') 
                {
                    if (1ll*sum2*tot%tot1!=0) l=-1;
                    else l=1ll*sum2*tot/tot1;
                    if (l>sum1&&l<=sum1+k[i]) ans++;
                    sum1+=k[i];
                }
                if (ch[i]=='W') 
                {
                    if (1ll*sum1*tot1%tot!=0) l=-1;
                    else l=1ll*sum1*tot1/tot;
                    if (l>sum2&&l<=sum2+k[i]) ans++;
                    sum2+=k[i];
                }
            }
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    WordPress错误:无法启用插件,因为它引起了一个致命错误
    快速使用 Thinkphp 之一: 准备工作-配置PHP环境及下载Thinkphp文件
    基于XML文件格式引用页面
    PHP清除html、css、js格式并去除空格的PHP函数
    本地无法启动MySQL服务,报的错误:1067,进程意外终止
    快速使用 Thinkphp 之二: 创建自己的应用项目
    HTML页面里加载flash文件源码
    【学习笔记】数据库 windrainpy
    【转】给年轻程序员的建议 windrainpy
    【转】js变量以及其作用域详解 windrainpy
  • 原文地址:https://www.cnblogs.com/nibabadeboke/p/11340087.html
Copyright © 2011-2022 走看看