题目
题目描述:
小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 ai,他觉得随机生成的数组不太美观,想把它变成回文数组,也是就对于任意 i∈[1,n] 满足 ai=an−i+1。小蓝一次操作可以指定相邻的两个数,将它们一起加 1 或减 1;也可以只指定一个数加 1 或减 1,请问他最少需要操作多少次能把这个数组变成回文数组?
输入格式:
输入的第一行包含一个正整数 n。
第二行包含 n 个整数 a1,a2,⋯,an,相邻整数之间使用一个空格分隔。
输出格式:
输出一行包含一个整数表示答案。
数据范围与说明:
【样例说明】
第一次操作将 a1,a2 加 1,变为 2,3,3,4;
后面两次操作将 a1 加 1,变为 4,3,3,4。
【评测用例规模与约定】
对于 20% 的评测用例,1≤n≤10;
对于所有评测用例,1≤n≤105,−106≤ai≤106。
输入输出样例 #1
输入:
输出:
题意
简述:
小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 ai,他觉得随机生成的数组不太美观,想把它变成回文数组,也是就对于任意 i∈[1,n] 满足 ai=an−i+1。小蓝一次操作可以指定相邻的两个数,将它们一起加 1 或减 1;也可以只指定一个数加 1 或减 1,请问他最少需要操作多少次能把这个数组变成回文数组?
代码
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; }
|