HDU 5583 - Kingdom of Black and White题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5583 - Kingdom of Black and White题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接(vjudge):https://vjudge.net/problem/HDU-5583

题目大意:

输入第一行为一个数字T,表示数据组数(1<=T<=50)。

接下来每一行有一个长度不超过100000的字符串,由0/1组成。

你可以对这个字符串进行一次操作,选择把一个0变成1或者把一个1变成0(也可以不操作).

之后,这个字符串的值就等于字符串中相邻相同的字符串长度的平方和。我们想令这个值最大。

例如000011,选择把第一个1变成0,即000001,字符串的值就是5*5+1*1=26.

输出最大值。

Sample Input
2
000011
0101
Sample Output
Case #1: 26
Case #2: 10

分析:

大概就是个模拟,先处理出每个连续串的长度,再枚举修改哪一个数字。

注意参与运算的变量全部要开long long

 

AC代码:

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<queue>
 6 #include<stack>
 7 
 8 inline int Min(int a,int b)
 9 {return a<b?a:b;}
10 
11 inline long long Max(long long a,long long b)
12 {return a>b?a:b;}
13 
14 int t,n,tmp,tot;
15 long long note[100002],ans,mx;
16 char s[100005];
17 
18 void init()
19 {
20     tmp = 1,tot = 0;
21     mx = 0,ans = 0;
22     memset(note,0,sizeof(note));
23 }
24 
25 int main()
26 {
27 //    freopen("1.txt","r",stdin);
28 //    freopen("stone.in","r",stdin);
29 //    freopen("stone.out","w",stdout);
30     scanf("%d",&t);
31     for(int x = 1;x <= t;++ x)
32     {
33         init();
34         scanf("%s",s);
35         n = strlen(s);
36         for(register int i = 1;i < n;++ i){
37             if(s[i] == s[i-1])
38                 ++ tmp;
39             else{
40                 note[++ tot] = 1LL*tmp;
41                 mx += 1LL*tmp*tmp;
42                 tmp = 1;
43             }
44         }
45         note[++ tot] = 1LL*tmp;
46         mx += 1LL*tmp*tmp;
47         ans = mx;
48         for(int i = 1;i < tot;++ i)
49         {
50             if(note[i+1] == 1)
51                 ans = Max(ans,1LL*(mx-note[i]*note[i]-note[i+1]*note[i+1]-note[i+2]*note[i+2]+(note[i]+note[i+1]+note[i+2])*(note[i]+note[i+1]+note[i+2])));
52             else 
53                 ans = Max(ans,1LL*(mx-note[i]*note[i]-note[i+1]*note[i+1]+(note[i+1]-1)*(note[i+1]-1)+(note[i]+1)*(note[i]+1)));
54             if(note[i] == 1)
55                 ans = Max(ans,1LL*(mx-note[i]*note[i]-note[i+1]*note[i+1]-note[i-1]*note[i-1]+(note[i-1]+note[i]+note[i+1])*(note[i-1]+note[i]+note[i+1])));
56             else
57                 ans = Max(ans,1LL*(mx-note[i]*note[i]-note[i+1]*note[i+1]+(note[i]-1)*(note[i]-1)+(note[i+1]+1)*(note[i+1]+1)));
58         }
59         printf("Case #%d: %I64d\n",x,ans);
60     }
61     return 0; 
62 }

 

以上是关于HDU 5583 - Kingdom of Black and White题解的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5583 - Kingdom of Black and White题解

HDU 5583 Kingdom of Black and White(模拟)

hdu 5943 Kingdom of Obsession 二分图匹配+素数定理

hdu5943 Kingdom of Obsession 二分图+打表找规律

HDU 5943 Kingdom of Obsession 二分图的匹配

HDU 5943 Kingdom of Obsession