解题思路:
贪心,优先操作相邻的两个数
注意事项:

数据需要开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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论