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;
}
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;
}
相关文章推荐
- HDU5583 Kingdom of Black and White
- HDU5583 Kingdom of Black and White
- HDU5583 Kingdom of Black and White
- HDU-5583 Kingdom of Black and White(思维)
- HDU 5583 Kingdom of Black and White 水题
- HDU - 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White 暴力
- hdu 5583 Kingdom of Black and White【枚举】
- hdu 5583 Kingdom of Black and White
- hdu 5583 Kingdom of Black and White
- hdu 5583 Kingdom of Black and White 2015ACM/ICPC亚洲区上海站-重现赛
- hdoj Kingdom of Black and White 5583 (模拟&&DP) 好题
- HDU-5583-Kingdom of Black and White【2015上海赛区】【暴力】
- HDU 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White
- hdoj 5583 Kingdom of Black and White
- HDU 5583 Kingdom of Black and White
- HDU-5583-Kingdom of Black and White(2015ACM/ICPC亚洲区上海站-重现赛)
- hhu Kingdom of Black and White 暴力 TWT Tokyo Olympic 1COMBO -1