2019浙大校赛--G--Postman(简单思维题)

一个思维水题

题目大意为,一个邮递员要投递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 }

猜你喜欢

转载自www.cnblogs.com/Never-Land/p/10713180.html