HDU-5583-Kingdom of Black and White(2015ACM/ICPC亚洲区上海站-重现赛)
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亚洲区上海站-重现赛)的更多相关文章
- HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~
F - Almost Sorted Array Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 2015ACM/ICPC亚洲区上海站
5573 Binary Tree(构造) 题意:给你一个二叉树,根节点为1,子节点为父节点的2倍和2倍+1,从根节点开始依次向下走k层,问如何走使得将路径上的数进行加减最终结果得到n. 联想到二进制. ...
- HDU 5583 Kingdom of Black and White(暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=5583 题意: 给出一个01串,现在对这串进行分组,连续相同的就分为一组,如果该组内有x个数,那么就对答案贡献x* ...
- HDU 5112 A Curious Matt (2014ACM/ICPC亚洲区北京站-重现赛)
A Curious Matt Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) ...
- HDU 5127.Dogs' Candies-STL(vector)神奇的题,set过不了 (2014ACM/ICPC亚洲区广州站-重现赛(感谢华工和北大))
周六周末组队训练赛. Dogs' Candies Time Limit: 30000/30000 MS (Java/Others) Memory Limit: 512000/512000 K ( ...
随机推荐
- 01背包(分组) HDOJ 4341 Gold miner
题目传送门 题意:有n个金矿,每个金矿有抓取的消耗的时间和价值,矿工在原点,问在T时间内能得到的最大的价值 分析:唯一和01背包不同的是金矿可能共线,也就是抓取近的金矿后才能抓后面共线的金矿.这是分组 ...
- 【Visual Studio Code 】使用Visual Studio Code + Node.js搭建TypeScript开发环境
1.准备工作 Node.js Node.js - Official Site Visual Studio Code Visual Studio Code - Official Site 安装Node. ...
- 嵌套查询--------关联一对多关系----------collection
参考来源: http://www.cnblogs.com/LvLoveYuForever/p/6689577.html <resultMap id="BaseResultMap&q ...
- 对char类型的数组进行冒泡排序
package maopaopaixu; import java.util.Arrays; import java.util.Scanner; public class Demo02 { public ...
- SP CAML工具
直接一直使用CAML做一些简单的SP列表查询,突然想对CAML进一步了解,于是找到两个常用工具,做以记录: 1 Caml Query Builder : 用于编写CAML查询,对初学者可以了解查询语句 ...
- window.form增删改查
效果展示: 查询: 可以查询姓名:民族:姓名+民族:都是空的查询全部 取值取得是姓名: 删除: 修改: 先选中查询之后修改: 添加: 代码部分: 第一张表: 第二张表:主表,民族代码加名称 natio ...
- Spark学习之基于MLlib的机器学习
Spark学习之基于MLlib的机器学习 1. 机器学习算法尝试根据训练数据(training data)使得表示算法行为的数学目标最大化,并以此来进行预测或作出决定. 2. MLlib完成文本分类任 ...
- opencv4android移植到系统app
最近在尝试使用opencv4android实现投影仪的自动对焦功能,在AndroidStudio后需要将功能移到系统工程编译成系统app,仅以此文记录下移植过程中遇到的问题. 首先去opencv官网下 ...
- 锐动SDK应用于行车记录仪
方案架构 手机端直播与录播功能忠实记录旅途中各种突发事件,还原事实真相,与家人和朋友分享沿途美景,一同感受美妙之旅. 强大的视频编辑功能,像编辑图片一样给视频添加各种滤镜,配音,配乐,标题文字等特效. ...
- 如何安装sql server2005 windows 8
如何安装sql server2005 windows 8 1 从网上下载到本地文件 ,这里使用的是cs_sql_2005_dev_all_dvd 安装版. 2. 点击下图所表示进行安装 3. ...