解题思路:
贪心,优先操作相邻的两个数
注意事项:
数据需要开long long,否则只能只能过部分数据
参考代码:
#include
#include
#include
using namespace std;
typedef long long ll;
int n;
ll cnt=0;
int arr[100010];
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> arr[i];
}
for(int i=1;i<=n;i++)
{
if(arr[i]==arr[n-i+1]) continue; //如果当前数和他的回文数相同,直接跳过,无需操作
if(arr[i]<arr[n-i+1]&&arr[i+1]<arr[n-(i+1)+1]) //相邻的两个数都比回文数小的情况
{
ll min1=min(arr[n-i+1]-arr[i],arr[n-(i+1)+1]-arr[i+1]); //取两个数和各自回文数相减的最小值
arr[i]+=min1;
arr[i+1]+=min1;;
cnt+=min1;;
}
else if(arr[i]>arr[n-i+1]&&arr[i+1]>arr[n-(i+1)+1]) //相邻两个数都比回文数大的情况
{
ll min1=min(arr[i]-arr[n-i+1],arr[i+1]-arr[n-(i+1)+1]);
arr[i]-=min1;
arr[i+1]-=min1;
cnt+=min1;
}
else if(arr[i]
{
ll ans=arr[n-i+1]-arr[i];
arr[i]+=ans;
cnt+=ans;
}
else if(arr[i]>arr[n-i+1]&&arr[i+1]<arr[n-(i+1)+1]) //一小一大的情况
{
ll ans=arr[i]-arr[n-i+1];
arr[i]-=ans;
cnt+=ans;
}
else if(arr[i]<arr[n-i+1]&&arr[i+1]==arr[n-(i+1)+1]) //一小一相同的情况
{
ll ans=arr[n-i+1]-arr[i];
arr[i]+=ans;
cnt+=ans;
}
else if(arr[i]>arr[n-i+1]&&arr[i+1]==arr[n-(i+1)+1]) //一大一相同的情况
{
ll ans=arr[i]-arr[n-i+1];
arr[i]-=ans;
cnt+=ans;
}
}
cout << cnt;
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复