一个思维水题
题目大意为,一个邮递员要投递N封信,一次从邮局来回只能投递K封。求最短的投递总距离。需注意,最后一次投递后无需返回邮局。
本题思路要点:
1、最后一次投递无需返回邮局,故最后一次投递所行走距离不必乘2(即不必记录返程),所以最后一次投递的是最远的三个信;
2、画图模拟可知,我们可将正负轴的邮件分开进行处理,先处理某一轴的全部信件,在处理另一轴的全部信件;
根据上述思路可得如下代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<memory.h> 4 #include<stdio.h> 5 #define max 1000005 6 using namespace std; 7 int a[100005],b[100005]; 8 int main(){ 9 int t; 10 scanf("%d",&t); 11 while(t--){ 12 int n,m,z,x=0,y=0,M; 13 scanf("%d %d",&n,&m); 14 memset(a,0,sizeof(a)); 15 memset(b,0,sizeof(b)); 16 for(int i=0;i<n;i++){ 17 scanf("%d",&z); 18 if(z>0){ 19 a[x]=z; 20 x++; 21 } 22 else if(z<0){ 23 b[y]=-z; 24 y++; 25 } 26 } 27 sort(a,a+x); 28 sort(b,b+y); 29 if(a[x-1]>b[y-1]){ //判断最远点 30 M=a[x-1]; 31 } 32 else{ 33 M=b[y-1]; 34 } 35 long long ans=0;//记得要 long long !!!!! 36 while(x-1>=0){ 37 ans+=a[x-1]*2; 38 x=x-m; 39 } 40 while(y-1>=0){ 41 ans+=b[y-1]*2; 42 y=y-m; 43 } 44 ans-=M; 45 cout<<ans<<endl; 46 } 47 }