Codeforces 427E Police Patrol

找中间的数,然后从两头取。

#include<stdio.h>
const int MAX = 1001000;
int pos[MAX];
int main()
{
    int n,m,tmp;
    int i;
    int pol;
    long long ans,dis;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)
            scanf("%d",&pos[i]);
        pol=n/2+1;
        tmp=m;
        ans=0;
        for(i=1;i<=pol;)
        {
            dis=0;
            while(i<=pol&&tmp--)
            {
                if(!dis)dis=pos[pol]-pos[i];
                i++;
            }
            ans=ans+dis*2;
            tmp=m;
        }
        for(i=n;i>pol;)
        {
            dis=0;
            while(i>pol&&tmp--)
            {
                if(!dis)dis=pos[i]-pos[pol];
                i--;
            }
            ans=ans+dis*2;
            tmp=m;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

更加简洁的代码

1<<n 就是把1向左移N位
m>>=1 相当于m= m>>1,就是把m左移1位
#include <stdio.h>
using namespace std;
const int MAX_N = 1000000 + 100;
int n, m;
int arr[MAX_N];
int main()
{
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++)
        scanf("%d", &arr[i]);
    int mid = n >> 1;
    //printf("mid:%d\n",mid);
    long long res = 0;
    for(int i = n - 1; i > mid; i -= m)
        res += arr[i] - arr[mid];
    for(int i = 0; i < mid; i += m)
        res += arr[mid] - arr[i];
    res = res << 1;
    printf("%I64d\n", res);
    return 0;
}

 

你可能感兴趣的:(codeforces)