P10902(洛谷题面

题目

题目描述:

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

输入格式:

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

第二行包含 nn 个整数 a1,a2,,ana_1, a_2,\cdots, a_n,相邻整数之间使用一个空格分隔。

输出格式:

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

数据范围与说明:

【样例说明】

第一次操作将 a1,a2a_1, a_211,变为 2,3,3,42, 3, 3, 4

后面两次操作将 a1a_111,变为 4,3,3,44,3,3,4

【评测用例规模与约定】

对于 20%20\% 的评测用例,1n101 \le n \le 10
对于所有评测用例,1n1051 \le n \le 10^5106ai106-10^6 \le a_i \le 10^6

输入输出样例 #1

输入:

1
2
4
1 2 3 4

输出:

1
3

题意

简述:

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

代码

C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N=1e5+10;
long long a[N],b[N],ans=0;
int main(){
ios_sync_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<(n+1)/2;i++){
if(a[i]>a[n-i+1]){
b[i]=a[n-i+1]-a[i];
}else{
b[n-i+1]=a[i]-a[n-i+1];
}
}
for(int i=0;i<n;i++){
long long m=min(b[i],b[i+1]);
b[i]-=m;
b[i+1]-=m;
ans+=m;
ans+=b[i];
}
cout<<ans<<endl;
return 0;
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int N=1e5+10;
long long a[N],b[N],ans=0;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=(n+1)/2;i++){
if(a[i]<a[n-i+1]){
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++){
long long m=min(b[i],b[i+1]);
b[i]-=m;
b[i+1]-=m;
ans+=m;
ans+=b[i];
}
cout<<ans<<endl;
return 0;
}