Kingdom of Black and White

                                                                                                           Time Limit: 2000/1000
MS (Java/Others)   

                                                                                                        Memory Limit: 65536/65536
K (Java/Others)

                                                                                          Total Submission(s): 1201    Accepted Submission(s): 374

->   Link 
 <-

看到这提交记录了吧,我活生生的拉低了通过率,都不造自己怎么想的,整整两天没A其他的题,就是死咬这道题,思路很早就有了,死活WA,终于在第三天中午浪费了一个午休搞出来了,不过参考了一下网上的博客,思路都差不多,还是有值得借鉴的地方,然后发现了一个坑点(就是跪在这两天),也发现了HDU上测试数据的问题;发了这么多时间还是有收获的;

题意:开始看了好久还看不懂,也不造求啥,后来分析样例明白了,就是给定的一个01串,求连续相同的字符的长度的平方和就是答案,然后现在可以改变一个字符,问这个值最大是?看样例,4个0,2个1,值就是4*4+2*2=20,改变一个字符很明显将与0相隔的那个1改成0,这样就是5个0,1个1,值为5*5+1*1=26;明白了吧;

思路: 一开始以为是个区间dp问题,后来问学长,其实就是把字符串压缩,只留下数量,比如上面的4 2,5 1这样的,然后改变一个使得平方和最大,我们来看,如果有长度有1,则可以合并左右 ,否则,从当前子串的左边或者右边改变一个,这样,当前的子串长度就加1,再与最大值 进行比较;

来看AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100000+10;
char s[N];
long long a[N],b[N];注意这里数据范围,就是跪在这里了;
int main()
{
int t,i,x;
scanf("%d",&t);
int t1=t;
while(t--)
{
scanf("%s",s);
x=strlen(s);
printf("Case #%d: ",t1-t);
if(x<4)
{
printf("%d\n",x*x);
continue;
}
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int j=1,k=0;
for(i=1; i<=x; i++)
{
if(s[i]==s[i-1])
j++;
else
{
a[k++]=j;//压缩;
j=1;
}
}
long long maxx=0;
for(i=0; i<k; i++)
b[i]=b[i-1]+a[i]*a[i];//累加起来,当改变某一小片段时左边和右边平方和是不变的;
long long max1=b[k-1];
for(i=0; i<k; i++)
if(a[i]==1)//当其为1时左右可以一起合并(恰好改变本身)
{
maxx=(a[i]+a[i-1]+a[i+1])*(a[i]+a[i-1]+a[i+1])+b[i-2];
if(i<k-1)//注意边界问题;
maxx+=b[k-1]-b[i+1];
max1=max(max1,maxx);
}
maxx=0;
for(i=0; i<k-1; i++)//往左合并一个;
{
maxx=(a[i]+1)*(a[i]+1)+(a[i+1]-1)*(a[i+1]-1)+b[i-1]+(b[k-1]-b[i+1]);
max1=max(max1,maxx);
}
for(i=1; i<k; i++)//往右合并一个;
{
maxx=(a[i]+1)*(a[i]+1)+(a[i-1]-1)*(a[i-1]-1)+b[i-2]+(b[k-1]-b[i]);
max1=max(max1,maxx);
}
printf("%I64d\n",max1);
}
return 0;
}

网上看的一个更简洁一点的思路(有所补充):AC

#include<bits/stdc++.h>
using namespace std;
const int N=100000+10;
char s[N];
long long a[N];
int main()
{
int t,x,i;
scanf("%d",&t);
int t1=t;
while(t--)
{
scanf("%s",s);
x=strlen(s);
i=0;
int j=0,k=0;
while(i<=j&&j<x)//压缩这里优化了一下;
{
while(j<x&&s[i]==s[j]) j++;
a[k++]=j-i;
i=j;
}
long long sum=0,maxx=0;
for(i=0;i<k;i++)
sum+=a[i]*a[i];//直接将未改变的值算出来,然后改变的话只需看增大了多少,加上即可;
for(i=1;i<k-1;i++)
if(a[i]==1)
{
long long neW=(a[i-1]+a[i+1]+1)*(a[i-1]+a[i+1]+1);//改变本身;
long long old=(a[i-1]*a[i-1])+a[i+1]*a[i+1]+1;//未改变的;
if(neW>old)
maxx=max(maxx,neW-old);
}
for(i=0;i<k-1;i++)//往左合并一个,如000011-->000001;
{
long long neW=(a[i]+1)*(a[i]+1)+(a[i+1]-1)*(a[i+1]-1);
long long old=a[i]*a[i]+a[i+1]*a[i+1];
if(neW>old)
maxx=max(maxx,neW-old);
}
for(i=1;i<k;i++)//往右合并一个(原代码没有这一块,但实际会出错,如1110000011,最大应输出46,而未考虑这种情况则输出44,但HDU上竟然过了,可见其测试数据之水)
{
long long neW=(a[i]+1)*(a[i]+1)+(a[i-1]-1)*(a[i-1]-1);
long long old=a[i]*a[i]+a[i-1]*a[i-1];
if(neW>old)
maxx=max(maxx,neW-old);
}
printf("Case #%d: ",t1-t);
printf("%I64d\n",sum+maxx);
}
return 0;
}

实力还是不行,学长秒有思路,然而我却以为是区间DP,思路就错了好久,然而思路正确却还是卡了两天,实在太弱!

HDU-5583-Kingdom of Black and White(2015ACM/ICPC亚洲区上海站-重现赛)的更多相关文章

  1. HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~

    F - Almost Sorted Array Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  2. HDU 5131.Song Jiang's rank list (2014ACM/ICPC亚洲区广州站-重现赛)

    Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java ...

  3. hdu 5583 Kingdom of Black and White(模拟,技巧)

    Problem Description In the Kingdom of Black and White (KBW), there are two kinds of frogs: black fro ...

  4. hdu 5583 Kingdom of Black and White

    Kingdom of Black and White Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  5. HDU 5583 Kingdom of Black and White 水题

    Kingdom of Black and White Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showpr ...

  6. 2015ACM/ICPC亚洲区上海站

    5573 Binary Tree(构造) 题意:给你一个二叉树,根节点为1,子节点为父节点的2倍和2倍+1,从根节点开始依次向下走k层,问如何走使得将路径上的数进行加减最终结果得到n. 联想到二进制. ...

  7. HDU 5583 Kingdom of Black and White(暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=5583 题意: 给出一个01串,现在对这串进行分组,连续相同的就分为一组,如果该组内有x个数,那么就对答案贡献x* ...

  8. HDU 5112 A Curious Matt (2014ACM/ICPC亚洲区北京站-重现赛)

    A Curious Matt Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) ...

  9. HDU 5127.Dogs' Candies-STL(vector)神奇的题,set过不了 (2014ACM/ICPC亚洲区广州站-重现赛(感谢华工和北大))

    周六周末组队训练赛. Dogs' Candies Time Limit: 30000/30000 MS (Java/Others)    Memory Limit: 512000/512000 K ( ...

随机推荐

  1. Person p = new Person("zhangsan",20);该句话都做了什么事情?

    1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中.2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化.3,在堆内 ...

  2. 块级元素的text-align对行内元素和果冻元素(inline-block)的作用

    块级元素社设置了text-align:center以后,对其直接行内元素/果冻元素.继承行内元素/果冻元素都会产生“居中效应”. <style> .test4{ text-align: c ...

  3. 原生开发之css样式问题(持续更新)

    ·移动端开发将div高度设置为设备高度 div{ Height:100vh; } · select选择器文字设置: /*select文字右对齐*/ select{ direction: rtl; } ...

  4. 利用Wamp在本地搭建一个wordpress站点

    原文链接:利用Wamp在本地搭建一个wordpress站点 有时候我们会想搭建一个自己的站点,可是由于只是想自己访问,就不是很想为这个站点在买一个服务器和域名,那我们可能首先就想到把自己电脑当做服务器 ...

  5. 分享div、text、Box Shadow(阴影)演示及代码的页面

    附图: 直接上链接:www.css88.com/tool/css3Preview/Box-Shadow.html

  6. [Android]Android Design之Navigation Drawer

    概述 在以前ActionBar是Android 4.0的独有的,后来的ActionBarSherlock的独步武林,对了还有SlidingMenu,但是这个可以对4.0下的可以做很好的适配.自从Goo ...

  7. System.Lazy<T>延迟加载

    在很多情况下,有些对象需要在使用时加载或根据逻辑动态加载.有些情况如果不延迟加载,可能会影响效率甚至抛出Timeout Exception.如网络操作.数据库操作.文件IO操作 直接上代码,方便我们理 ...

  8. js 复制文字、 复制链接到粘贴板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. java的回调方式

    经常写js的回调,js的回调很简单,直接传方法名称,但是java中方法不能作为参数传递 但是java中可以传一个对象,在对象中编写多个方法,然后作为参数传递到对象里以后,就可以在适当的时机调用该对象里 ...

  10. python selenium等待特定网页元素加载完毕

    selenium等待特定元素加载完毕 is_disappeared = WebDriverWait(driver, 8, 0.5, ignored_exceptions=TimeoutExceptio ...