1. 程式人生 > >21. [HAOI2005] 希望小學 (wa1)

21. [HAOI2005] 希望小學 (wa1)

pro std bmi 希望 %d while log 自然 space

★★ 輸入文件:hopeschool.in 輸出文件:hopeschool.out 簡單對比

時間限制:1 s 內存限制:128 MB

【問題描述】

地處偏僻山區的X鄉有N個自然村,目前還沒有一所小學,孩子們要麽不上學,要麽需要翻過一座大山到別處上學。如今好啦,有一位熱心人士準備捐款在某個自然村建立一所希望小學。
通過調查發現,X鄉各個村莊之間的道路較為復雜,有平路、上坡和下坡。考慮到每個村孩子們的人數不同,走上坡、下坡和平路的速度也不同,?男孩和女孩走路速度也不同,請你為X鄉選擇一個最合適建立希望小學的村莊,使得所有的孩子花在路上的總時間最少。

【輸入文件】

hopeschool.in

第1行: N B1 B2 B3 G1 G2 G3 (村莊數、男孩分別走平路、上坡、下坡每千米花費的時間以及女孩分別走平路、上坡、下坡每千米花費的時間)
第2行: Xl X2……Xn (Xi表示第i個村要上學的男孩人數)
第3行: Y1 Y2……Yn (Yi表示第i個村要上學的女孩人數)
第4行: K (道路數)
第5—K+4行: Ai Bi Si1 Si2 Si3 (村莊Ai到村莊Bi,平路Sil千米,上坡Si2千米,下坡Si3千米,i=1,2,…,K)

【輸出文件】

hopeschool.out

T(將要建立希望小學村莊的編號)

【約束條件】

(1) N<=30, Xi<=20, Yi<=20
(2) K<=100, 每條路的長度<=30千米
(3) B1,B2,B3,G1,G2,G3為整數,都小於10個單位時間/每千米
(4) 每條道路只給出一組數據。例如:5 8 7 10 3表示從村莊5往村莊8走,平路
有7千米,上坡10千米。 下坡3千米;當然也表示從村莊8往村莊5走,平路有7千米,
上坡3千米。下坡10千米。

【輸入輸出樣例】

技術分享

hopeschool.in

2 2 2 1 2 3 2
10 12
5 4
1
1 2 10 2 1

hopeschool.out

2

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
 
using namespace std;
const int N=35;
const int Maxn=9999999;
 
int map[N][N];
int boy[N],girl[N]; 
int n,bmid,bup,bdown,gmid,gup,gdown,road;
int u,v,mid,up,down; int ans_dis=Maxn,answer,now_dis; inline int read() { int x=0;char c=getchar(); while(c<0||c>9)c=getchar(); while(c>=0&&c<=9)x=x*10+c-0,c=getchar(); return x; } int main() { freopen("hopeschool.in","r",stdin); freopen("hopeschool.out","w",stdout); n=read(),bmid=read(),bup=read(),bdown=read(), gmid=read(),gup=read(),gdown=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) map[i][j]=Maxn; for(int i=1;i<=n;i++) boy[i]=read(); for(int i=1;i<=n;i++) girl[i]=read(); road=read(); for(int i=1;i<=road;i++) { u=read(),v=read(),mid=read(),up=read(),down=read(); int impb=bmid*mid+bup*up+bdown*down; int impg=gmid*mid+gup*up+gdown*down; map[u][v]=boy[u]*(impb)+girl[u]*(impg); map[v][u]=boy[v]*(impb)+girl[v]*(impg); } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) map[i][j]=min(map[i][j],map[i][k]+map[k][j]); for(int i=1;i<=n;i++) { now_dis=0; for(int j=1;j<=n;j++) if((i-j)!=0) now_dis+=map[j][i]; if(now_dis<ans_dis) ans_dis=now_dis, answer=i; } printf("%d%d",answer,ans_dis); return 0; } /* 8 2 3 1 3 4 2 10 10 10 10 10 10 10 10 2 2 2 2 2 2 2 2 11 1 2 4 2 2 2 3 5 1 3 3 4 6 0 0 4 5 3 5 2 5 6 9 0 1 6 7 8 2 0 7 1 5 2 2 1 8 0 5 0 7 8 0 5 0 3 8 2 5 0 4 8 0 6 0 */

21. [HAOI2005] 希望小學 (wa1)