#421 Div.2 D. Mister B and PR Shifts

题目链接:
http://codeforces.com/contest/820/problem/D

大意:
给一个数组 p[i]
这里写图片描述 值。
每次操作旋转一次数组(即最后一个数字变为第一个) 如 1 2 3 -> 3 1 2
这里写图片描述 的最小值 输出最小值和变换次数。
input
3
1 2 3
output
0 0
input
3
2 3 1
output
0 1
input
3
3 2 1
output
2 1

#include<bits/stdc++.h>
using namespace std;
#define D(v) cout<<#v<<" "<<v<<endl
#define LL long long
int p[1000005], cur[2000005];
int main(void)
{
    LL ans,sum;
    int n,L,r,i,temp;
    scanf("%d", &n);
    sum = L = r = temp = 0;
    for(i=1;i<=n;i++)
        scanf("%d", &p[i]);
    for(i=1;i<=n;i++)
    {
        sum += abs(p[i]-i);
        if(p[i]>=i)  L++, cur[p[i]-i]++;//cur[i]可以理解为再向后移动i位后a[i]-i>=0。
        else  r++;
    }
    ans = sum;
    for(i=0;i<n-1;i++)
    {
        L -= cur[i]; r += cur[i];
        sum = sum-L+r-abs(p[n-i]-n-1)+abs(p[n-i]-1);//相当于p[n-i]先移到后面的n+1位置 再从n+1移到1
        cur[p[n-i]+i]++; //重新更新 L , r 和 cur[]
        L++, r--; //...
        if(sum<ans)
            ans=sum,temp=i+1;
    }
    printf("%lld %d\n",ans,temp);
    return 0;
}

参考博客:
http://www.cnblogs.com/TnT2333333/p/7091392.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值