1. 程式人生 > >2019浙大校賽--G--Postman(簡單思維題)

2019浙大校賽--G--Postman(簡單思維題)

src += std amp 畫圖 long div scanf fin

一個思維水題

技術分享圖片

題目大意為,一個郵遞員要投遞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 }

2019浙大校賽--G--Postman(簡單思維題)