hrbust 1594 Gragon Ball【模拟】

Gragon Ball
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 16(7 users)Total Accepted: 8(6 users)Rating: Special Judge: No
Description

    在wd打败使者之后,神龙出现了,神龙告诉他们是那个邪恶的使者封印了它,现在他们终于让自己重获自由了,神龙决定送给他们一些龙珠,但是能拿多少还得看他们自己,神龙设置了一个装置:


装置的中央是一个龙头,龙头能够射出一种颜色的珠子,如果该珠子能够和轨道中相连的珠子形成同种颜色并且数量在三个或三个以上(包括射出去的这颗珠子)就能够将这几个相同颜色的珠子消除,如果不能消去珠子就在相应的位置上插入那个射出去的珠子。如果将珠子消去了,那么这几个消失的珠子两边的珠子就会接到一起,如果新接到一起的两个珠子颜色相同,并且接到一起之后形成至少三个连续的同色的珠子便可以继续消除,每次同色的珠子在消除时会根据该次同色珠子数量计算积分。例如:原来的珠子序列是AAABBCCC 如果射出去的珠子颜色是B而且将中间的两个B消除的话,会形成AAA ,CCC两段,拼接到一起之后是AAACCC不会继续消除,而如果将AABBACCC中的B消去之后两端的A拼接到了一起并满足条件就可以继续消除,最终形成CCC序列。

每次消去一段之后,会按照消去珠子的数目累计分数,如果新拼接到一起的珠子可以继续消除就能产生连锁得分,相应的得分规则如下:

                    

        普通珠子得分                                         连锁得分



wd和Cc只有发射一颗龙珠的机会,而且他们可以将珠子插入到原始龙珠序列的任意一个位置,最终神龙将会按照他们得到的最大分数来给他们相应的龙珠,那么他们最多可以得到多少积分?   


Input

多组测试数据,第一行一个整数T表示数据的组数

每组测试数据输入一个字符串表示龙珠颜色的初始序列(用大写的英文字母表示,长度小于100)和一个大写的英文字母表示射出的珠子的颜色,题目保证最大的连锁和同色珠子消去时的数目不会超过9 

Output

对于每组测试数据,输出一个整数表示得到的最大分数,每组测试数据占一行。

Sample Input

1

AACBBCCA B

Sample Output

12

Hint

样例中,首先用B将中间的两个B消除,该次同色的珠子数目是3,积分是2,无连锁加分,B消除之后,两端的C拼接到一起继续消除,且该次同色的珠子个数是3个,积分是2,由于是2连锁,该次实际增加了2*2=4的积分,然后C消除之后,A拼接到一起,满足条件并继续消除,珠子个数是3个,积分是2,由于是3连锁,该次实际增加了2*3=6的积分,这样总的积分为 2 + 4 + 6 = 12.

注意同种颜色珠子的消除只有在同色的珠子拼接到一起才会发生,例如:两段的珠子为AAA,BBB,拼接到一起时不会消除,但是如果为

AA, A拼接到一起时则可以消除。

Author
周洲@nova

思路:按照题目要求模拟。


1、先判断能否消掉第一波


2、如果能够消掉第一波,控制两个指针,一个指向现在左边的第一个球 ,一个指向右边的第一个球,进行各种判断,循环处理每一波的消去。


AC代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
char a[105],aa;
int n;
int val[10]={0,0,0,2,4,5,6,7,8,9};
int Slove(int pos)
{
    int sum=0;
    int cont=0;
    int i;
    for(i=pos;i<n;i++)
    {
        if(a[i]==aa)cont++;
        else break;
    }
    //printf("%d ",cont);
    if(cont<2)return 0;
    sum+=val[cont+1];
    int zuo=pos-1;
    int you=i;
    char tmp=a[zuo];
    int huihe=2;
    while(1)
    {
        int cont=0;
        if(a[zuo]!=tmp||a[you]!=tmp)break;
        while(a[zuo]==tmp&&zuo>=0)
        {
            cont++;
            zuo--;
        }
        zuo++;
        while(a[you]==tmp&&you<n)
        {
            cont++;
            you++;
        }
        if(cont<3)break;
        you--;
        sum+=val[cont]*huihe;
        zuo--;you++;
        tmp=a[zuo];
        huihe++;
        if(zuo<0||you>n)break;
    }
    //printf("%d\n",sum);
    return sum;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int output=0;
        scanf("%s %c",a,&aa);
        n=strlen(a);
        for(int i=0;i<n;i++)
        {
            if(a[i]==aa)
        output=max(output,Slove(i));
        }
        printf("%d\n",output);
    }
}
/*
10
AACBBCCA B
AABAABAABB A
*/






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值