Police Patrol
题目描述:
题目大概讲述的是,现在要在x轴上建一座警察局,x轴上有n个罪犯,现在警局有一辆最多能够装载m个人的巡逻车,然后题目让我们求这辆巡逻车把所有罪犯运回警察局需要行驶的最短距离是多少。
题目分析:
这个题目警察局的位置不同会影响到答案的不一样,因此我们要尽量把警察局建在一个合适的位置,使得巡逻车所行驶的无用距离最短(所谓的无用距离是指巡逻车从警察局到达第一个罪犯的距离),如果警察局在所有罪犯的左边或者右边的话,我们会发现无用距离是很大的,而如果警察局在罪犯的中间的话,那么无用距离就会大大减小。
其实警察局的位置不用枚举出来,我们假设警察局在罪犯中间的某个位置,最左边的罪犯到最右边的罪犯的距离是无论警察局位置在哪里都不会改变的,这个距离的两倍就是巡逻车从警察局到左边搭载u个罪犯(u<=m)以及右边搭载v个罪犯(v<=m)需要行驶的距离,根据贪心策略,巡逻车每次从警察局出发无论向左边还是右边,尽可能运输多一些的罪犯,模拟这个过程,直到所有罪犯都被运输完后,以上每次运输罪犯需要行驶的距离的总和便是答案。
代码:
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cstring>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <deque>
#define reg register
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define lowbit(x) (x&(-x))
using namespace std;
const int Maxn=1e6+5;
ll x[Maxn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for (reg int i=1;i<=n;i++) scanf("%lld",&x[i]);
int l=1,r=n;
ll ans=0;
while (l<r)
{
ans+=(x[r]-x[l])<<1;
l+=m;
r-=m;
}
printf("%lld\n",ans);
return 0;
}