居民集会 蓝桥杯Java

    xiaoxiao2022-07-14  171

    标题:居民集会

    蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di。

    每年,蓝桥村都要举行一次集会。今年,由于村里的人口太多,村委会决定要在4个地方举行集会,其中3个位于公路中间,1个位最公路的终点。

    已知每户家庭都会向着远离公路起点的方向去参加集会,参加集会的路程开销为家庭内的人数ti与距离的乘积。

    给定每户家庭的位置di和人数ti,请为村委会寻找最好的集会举办地:p1, p2, p3, p4 (p1<=p2<=p3<=p4=L),使得村内所有人的路程开销和最小。

    【输入格式】 输入的第一行包含两个整数n, L,分别表示蓝桥村的家庭数和公路长度。 接下来n行,每行两个整数di, ti,分别表示第i户家庭距离公路起点的距离和家庭中的人数。

    【输出格式】 输出一行,包含一个整数,表示村内所有人路程的开销和。

    import java.util.Collections; import java.util.HashSet; import java.util.Scanner; public class Test6 { static boolean vis[]; static int L;//公路长度 static HashSet<Integer> set = new HashSet<Integer>(); static void dfs(int[][]a,int[]l,int p){//l存四个点的位置 if(p >3){ l[3] = L;//第四个位于公路终点 int z = 0; for(int i =0;i<a.length;i++){ for(int j=0;j<4;j++){ if(a[i][0] <= l[j]) { z +=a[i][1] * (l[j] - a[i][0]); break; } else{ continue; } } } set.add(z); return; } for(int i =0;i<a.length;i++){ if(!vis[i]){ l[p++] = a[i][0]; dfs(a,l,p); p--; vis[i] = false; } } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner s = new Scanner(System.in); int n = s.nextInt();//家庭数 L = s.nextInt();//公路长度 int[][]a = new int[n][2];//第i户家庭距离公路起点的距离和家庭中的人数 vis = new boolean[n];//没有参加集会 for(int i=0;i<n;i++){ a[i][0] = s.nextInt(); a[i][1] = s.nextInt(); } dfs(a,new int[4],0); int min = Collections.min(set); System.out.println(min); } }
    最新回复(0)