找中间的数,然后从两头取。
#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 ",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 ",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 ", res); return 0; }