解题思路:
贪心,优先操作相邻的两个数
注意事项:
数据需要开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语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:545 |
C语言程序设计教程(第三版)课后习题10.1 (Java代码)浏览:1492 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:724 |
WU-复数求和 (C++代码)浏览:2119 |
WU-格式化数据输出 (C++代码)浏览:1312 |
WU-格式化数据输出 (C语言代码)浏览:1818 |
三角形 (C语言代码)浏览:965 |
C二级辅导-分段函数 (C语言代码)浏览:659 |
字符逆序 (C语言代码)浏览:675 |
陶陶摘苹果2 (C语言代码)浏览:650 |