您的位置:首页 > 其它

hdu5583_Kingdom of Black and White_思维

2017-06-23 20:52 281 查看
[align=left]Problem Description[/align]
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.
 

[align=left]Input[/align]
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.
 

[align=left]Output[/align]
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.
 

[align=left]Sample Input[/align]

2
000011
0101

 

[align=left]Sample Output[/align]

Case #1: 26
Case #2: 10

题意:

给你一个串,由01组成,需要改变一个串(将1改成0,或者将0改成1),使得最后的连续的串的个数的平方和最大

解:

将字符串处理成数字存在数组里,求解改变后的数值变化与之前的数值差值最大的那个位置就行。

在改变数值的时候有三种情况,如串长为4 5这组,有3  6前减后加的情况,有5 4前加后减的情况,以及5 1 2这组中合并为8的情况。

分别处理就行了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e5+50;
char str[maxn];ll cnt[maxn];
int main()
{
int t;
scanf("%d",&t);
int cas=0;
while(t--)
{
memset(cnt,0,sizeof(cnt));
scanf("%s",str);
int len=strlen(str);
char p=str[0];
ll k=0,num=1;
ll sum=0;
if(len==1)
{printf("Case #%d: 1\n",++cas);continue;}
for(int i=1;i<len;i++)
{
if(str[i]!=p)
{
cnt[k++]=num;
sum+=num*num;
num=1;
p=str[i];
}
else
{
num++;
}
if(i==len-1)
{
cnt[k++]=num;
sum+=num*num;

}
}
/*for(int i=0;i<k;i++)
cout<<cnt[i]<<" ";
cout<<endl;
cout<<sum<<endl;*/
ll sum1=0,pos=0,sum2=0,pos1=0;ll cha=0;
for(int i=0;i<k-1;i++)
{
int a=cnt[i]+1,b=cnt[i+1]-1,c=cnt[i]-1,d=cnt[i+1]+1;
//cout<<"ABCD:"<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
if(b==0)
{
if(i+2<k)
{
sum2=(a+cnt[i+2])*(a+cnt[i+2]);
pos1=cnt[i]*cnt[i]+cnt[i+1]*cnt[i+1]+cnt[i+2]*cnt[i+2];
if(abs(sum2-pos1)>cha)
{
cha=abs(sum2-pos1);
sum1=sum2;
pos=pos1;
}
else
continue;
}
else
{
sum2=a*a;
pos1=cnt[i]*cnt[i]+cnt[i+1]*cnt[i+1];
if(abs(sum2-pos1)>cha)
{
cha=abs(sum2-pos1);
sum1=sum2;
pos=pos1;
}
else
continue;
}
}
if(c==0)
{
if((i-1)>=0)
{
sum2=(d+cnt[i-1])*(d+cnt[i-1]);
pos1=cnt[i-1]*cnt[i-1]+cnt[i]*cnt[i]+cnt[i+1]*cnt[i+1];
if(abs(sum2-pos1)>cha)
{
cha=abs(sum2-pos1);
sum1=sum2;
pos=pos1;
}
else
continue;
}
else
{
sum2=d*d;
pos1=cnt[i]*cnt[i]+cnt[i+1]*cnt[i+1];
if(abs(sum2-pos1)>cha)
{
cha=abs(sum2-pos1);
sum1=sum2;
pos=pos1;
}
else
continue;
}
}
if(b!=0&&c!=0)
{
int tmp=(a*a)+(b*b);
int tmp2=(c*c)+(d*d);
//cout<<"TMP:"<<tmp<<" TMP2:"<<tmp2<<endl;
sum2=tmp;
pos1=cnt[i]*cnt[i]+cnt[i+1]*cnt[i+1];
if(abs(sum2-pos1)>cha)
{
cha=abs(sum2-pos1);
sum1=sum2;
pos=pos1;
}
sum2=tmp2;
pos1=cnt[i]*cnt[i]+cnt[i+1]*cnt[i+1];
if(abs(sum2-pos1)>cha)
{
cha=abs(sum2-pos1);
sum1=sum2;
pos=pos1;
}
}
}

//cout<<"POS:"<<pos<<" SUM1:"<<sum1<<endl;
printf("Case #%d: %lld\n",++cas,sum-pos+sum1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: