Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum

题目链接
在这里插入图片描述
在这里插入图片描述
题意:
给一个n大小的数组,n一定为偶数(且这个数组中的数字大大于于1小于等于k)。第i个位置和第n-i+1个位置为一对。现在要求每一对的和都要相等,问最少改变几次数组中的数。使得满足条件。

思路:
先按着贪心的思路去想,发现并不满足贪心的条件。
然后我们想,既然贪心不满足,也没有什么规律(即这个和相等的数是没有办法一步到位的),那么肯定是要做什么预处理。然后我们想,既然给定了一个数字的范围。那岂不是俩个数的和也是在一个范围内的。我们现在已经知道俩个数字,那么我们可以枚举和的范围,在俩数和一定时,这俩个数需要改变几次。再利用一下前缀和废话不多说,基本思路知道了,直接上代码比陈述管用。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200005];//存储数字
int sum[400005];//前缀和数组
void add(int l,int r,int x)
{
    if(l>r)return ;
    sum[l]+=x;//在l到r内的和需要改变x次;
    sum[r+1]-=x;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=0;i<=2*k;i++)sum[i]=0;//初始化
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n/2;i++)
        {
            int aa=a[i],bb=a[n-i+1];//取一对
            add(2,min(aa,bb),2);//和为2到aa,bb最小值的需要改变俩次数字,自己想想。。以下同理
            add(min(aa,bb)+1,aa+bb-1,1);
            add(aa+bb+1,max(aa,bb)+k,1);
            add(max(aa,bb)+k+1,2*k,2);
        }
        for(int i=1;i<=2*k;i++)sum[i]=sum[i]+sum[i-1];//前缀和
        int minn=1e9;
        for(int i=2;i<=2*k;i++)minn=min(minn,sum[i]);//取和为i时,最小次数;
        printf("%d\n",minn);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值