本文主要是介绍【前缀和】AcWing. 562 / Google Kickstart2018 Round H Problem B《壁画》(c++),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.题目说明
Thanh 想在一面被均分为 N 段的墙上画一幅精美的壁画。
每段墙面都有一个美观评分,这表示它的美观程度(如果它的上面有画的话)。
不幸的是,由于洪水泛滥,墙体开始崩溃,所以他需要加快他的作画进度!
每天 Thanh 可以绘制一段墙体。
在第一天,他可以自由的选择任意一段墙面进行绘制。
在接下来的每一天,他只能选择与绘制完成的墙面相邻的墙段进行作画,因为他不想分开壁画。
在每天结束时,一段未被涂颜料的墙将被摧毁(Thanh 使用的是防水涂料,因此涂漆的部分不能被破坏),且被毁掉的墙段一定只与一段还未被毁掉的墙面相邻。
Thanh 的壁画的总体美观程度将等于他作画的所有墙段的美观评分的总和。
Thanh想要保证,无论墙壁是如何被摧毁的,他都可以达到至少 B 的美观总分。
请问他能够保证达到的美观总分 B 的最大值是多少。
2.输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据的第一行包含整数 N。
第二行包含一个长度为 N 的字符串,字符串由数字 0∼9 构成,第 i 个字符表示第 i 段墙面被上色后能达到的美观评分。
3.输出格式
每组数据输出一个结果,每个结果占一行。
结果表示为 Case #x: y,其中 x 为组别编号(从 1 开始),y 为 Thanh 可以保证达到的美观评分的最大值。
4.数据范围
1≤T≤100,
存在一个测试点N=5∗10的6次方,其他测试点均满足2≤N≤100
5.输入样例
4
4
1332
4
9583
3
616
10
1029384756
6.输出样例
Case #1: 6
Case #2: 14
Case #3: 7
Case #4: 31
7.代码
#include<iostream>
using namespace std;
const int N = 5000010;
int t,s[N];
char str[N];
int main(){scanf("%d",&t);for(int cases = 1;cases <= t;cases++){int n;scanf("%d",&n);scanf("%s", str + 1);//前缀和数组for (int i = 1; i <= n; i ++ )s[i] = s[i - 1] + str[i] - '0';//用区间长度的尾部开始直到遍历结束,找出所有区间里的最大值。int res = 0, m = (n + 1) / 2;for (int i = m; i <= n; i ++ )res = max(res, s[i] - s[i - m]);printf("Case #%d: %d\n", cases, res);}return 0;
}
这篇关于【前缀和】AcWing. 562 / Google Kickstart2018 Round H Problem B《壁画》(c++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!