uq_66679499795


私信TA

用户名:uq_66679499795

访问量:1455

签 名:

等  级
排  名 2071
经  验 2475
参赛次数 10
文章发表 24
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

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

数据需要开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 人评分

  评论区

  • «
  • »