hdu 5583 Kingdom of Black and White【枚举】

来源:互联网 发布:缅甸语翻译软件 编辑:程序博客网 时间:2024/05/20 18:43

Kingdom of Black and White

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1323    Accepted Submission(s): 407

Problem Description

In the Kingdom of Black and White (KBW), there are two kinds of frogs: black frog and white frog.

Now N frogs are standing in a line, some of them are black, the others are white. The total strength of those frogs are calculated by dividing the line into minimum parts, each part should still be continuous, and can only contain one kind of frog. Then the strength is the sum of the squared length for each part.

However, an old, evil witch comes, and tells the frogs that she will change the color of at most one frog and thus the strength of those frogs might change.

The frogs wonder the maximum possible strength after the witch finishes her job.

Input

First line contains an integer T, which indicates the number of test cases.

Every test case only contains a string with length N, including only 0 (representing
a black frog) and 1 (representing a white frog).

⋅ 1≤T≤50.

⋅ for 60% data, 1≤N≤1000.

⋅ for 100% data, 1≤N≤105.

⋅ the string only contains 0 and 1.

Output

For every test case, you should output "Case #x: y",where x indicates the case number and counts from 1 and y is the answer.

Sample Input

2

000011

0101

Sample Output

Case #1: 26

Case #2: 10

Source

2015ACM/ICPC亚洲区上海站-重现赛(感谢华东理工)

 

 题目大意:两种颜色的青蛙站一排,连在一起的n个青蛙贡献的值为n*n,比如第一组样例:4*4+2*2=20,现在我们可以任意让一个青蛙变色,问改变一只青蛙的颜色之后的最大值。


思路:


1、将每个区间的青蛙数保存在一个数组b【】中,b【i】表示第i个连在一起的青蛙区间中有多少青蛙。比如第一组样例:b【0】=4,b【1】=2;


2、暴力枚举每个区间:

如果区间青蛙数大于1:

①让区间的左边少一只青蛙,让其和左边的区间连在一起。

②让区间的右边少一只青蛙,让其和右边的区间连在一起。

否则:

连接其左边的区间和右边的区间和这只青蛙。

并维护最大值即可


Ac代码:


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define ll long long intchar a[1000000];ll b[1000000];int main(){    int t;    int kase=0;    scanf("%d",&t);    while(t--)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        scanf("%s",a);        int n=strlen(a);        int cont=0;        for(int i=0;i<n;i++)        {            for(int j=i;j<n;j++)            {                if(a[i]!=a[j])                {                    b[cont++]=j-i;                    i=j-1;                    break;                }                if(j==n-1)                {                    b[cont++]=j-i+1;                    i=n;                    break;                }            }        }        ll output=0;        for(int i=0;i<cont;i++)        {            output+=b[i]*b[i];        }        ll pre=output;        for(int i=0;i<cont;i++)        {            if(b[i]-1==0)            {                ll y=0,z=0;                if(i-1>=0)y=b[i-1];                if(i+1<cont)z=b[i+1];                ll tmp=pre-1-y*y-z*z+(1+y+z)*(1+y+z);                output=max(output,tmp);                continue;            }            ll tmp=pre-b[i]*b[i]+(b[i]-1)*(b[i]-1);            if(i-1>=0)            output=max(tmp+(b[i-1]+1)*(b[i-1]+1)-(b[i-1]*(b[i-1])),output);            if(i+1<cont)            output=max(tmp+(b[i+1]+1)*(b[i+1]+1)-(b[i+1]*b[i+1]),output);        }        printf("Case #%d: %I64d\n",++kase,output);    }}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁小儿牙龈红肿怎么办 宝宝出牙牙龈红肿怎么办 3岁宝宝牙龈红肿怎么办 1岁宝宝牙龈红肿怎么办 4岁宝宝牙龈红肿怎么办 儿童牙黑了怎么办啊 牙黑了掉了一块怎么办 1岁幼儿牙齿腐蚀怎么办 我的大牙变黑了怎么办 牙齿里面黑了疼怎么办 最里面的牙黑了怎么办 牙龈的肉裂开了怎么办 有蛀牙怎么办可以变好么 拔智齿没拔干净怎么办 蛀牙只剩牙根了怎么办 牙掉的就剩牙根怎么办 蛀牙牙冠都掉了怎么办 拔智齿断了牙根怎么办 牙肉肿痛有脓包怎么办 种植牙到寿命后怎么办 牙齿松动快掉了怎么办 一颗牙齿松动了怎么办 种植牙牙冠掉了怎么办 牙就剩下牙根了怎么办 后面的大牙掉了怎么办 两边大牙都没了怎么办 拔牙把牙根断了怎么办 拔乳牙牙根断了怎么办 拔牙时牙根断了怎么办 孕晚期牙根掉了怎么办 根管治疗后牙裂怎么办 智齿拔断了牙根怎么办 大牙断了牙根还在怎么办 孕妇牙疼的要命怎么办 牙烂了个大窟窿怎么办 牙齿又痒又痛怎么办 大牙就剩牙根了怎么办 蛀牙只剩牙根痛怎么办 带牙冠的牙疼了怎么办 牙龈肉与牙分离怎么办 后槽牙松动还疼怎么办