解题思路:
贪心,优先操作相邻的两个数
注意事项:
数据需要开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 人评分
1009题解浏览:752 |
Minesweeper (C语言描述,蓝桥杯)浏览:1127 |
【偶数求和】 (C语言代码)浏览:431 |
1054题解浏览:467 |
字符串比较 (C语言代码)浏览:685 |
C语言程序设计教程(第三版)课后习题12.3 (C语言代码)浏览:548 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:676 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:610 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:562 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:512 |