打卡信奥刷题(855)用C++信奥P10902[普及组/提高] [蓝桥杯 2024 省 C] 回文数组

P10902 [蓝桥杯 2024 省 C] 回文数组

题目描述

小蓝在无聊时随机生成了一个长度为 n n n 的整数数组,数组中的第 i i i 个数为 a i a_i ai,他觉得随机生成的数组不太美观,想把它变成回文数组,也是就对于任意 i ∈ [ 1 , n ] i\in [1,n] i[1,n] 满足 a i = a n − i + 1 a_i=a_{n-i+1} ai=ani+1。小蓝一次操作可以指定相邻的两个数,将它们一起加 1 1 1 或减 1 1 1;也可以只指定一个数加 1 1 1 或减 1 1 1,请问他最少需要操作多少次能把这个数组变成回文数组?

输入格式

输入的第一行包含一个正整数 n n n

第二行包含 n n n 个整数 a 1 , a 2 , ⋯   , a n a_1, a_2,\cdots, a_n a1,a2,,an,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

输入输出样例 #1

输入 #1

4
1 2 3 4

输出 #1

3

说明/提示

【样例说明】

第一次操作将 a 1 , a 2 a_1, a_2 a1,a2 1 1 1,变为 2 , 3 , 3 , 4 2, 3, 3, 4 2,3,3,4

后面两次操作将 a 1 a_1 a1 1 1 1,变为 4 , 3 , 3 , 4 4,3,3,4 4,3,3,4

【评测用例规模与约定】

对于 20 % 20\% 20% 的评测用例, 1 ≤ n ≤ 10 1 \le n \le 10 1n10
对于所有评测用例, 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105 − 1 0 6 ≤ a i ≤ 1 0 6 -10^6 \le a_i \le 10^6 106ai106

C++实现

#include
using namespace std;
const int N=1e5+10;
long long n,a[N],b[N],ans;
int main()
{
scanf(“%lld”,&n);
for(int i=1;i<=n;i++)
scanf(“%lld”,&a[i]);
for(int i=1;i<=(n+1)/2;i++)
{
if(a[i] b[i]=a[n-i+1]-a[i];
else
b[n-i+1]=a[i]-a[n-i+1];
}
for(int i=1;i<=n;i++)
{
int mn=min(b[i],b[i+1]);
b[i]-=mn;
b[i+1]-=mn;
ans+=mn;
ans+=b[i];
}
printf(“%lld”,ans);
}

打卡信奥刷题(855)用C++信奥P10902[普及组/提高] [蓝桥杯 2024 省 C] 回文数组_第1张图片

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

你可能感兴趣的:(C++,c++,算法,开发语言,青少年编程,数据结构)