居民集会--第六届蓝桥杯国赛JAVA C组第六题

xiaoxiao2021-02-27  146

标题:居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di。 每年,蓝桥村都要举行一次集会。今年,由于村里的人口太多,村委会决定要在4个地方举行集会,其中3个位于公路中间,1个位最公路的终点。 已知每户家庭都会向着远离公路起点的方向去参加集会,参加集会的路程开销为家庭内的人数ti与距离的乘积。 给定每户家庭的位置di和人数ti,请为村委会寻找最好的集会举办地:p1, p2, p3, p4 (p1<=p2<=p3<=p4=L),使得村内所有人的路程开销和最小。 【输入格式】 输入的第一行包含两个整数n, L,分别表示蓝桥村的家庭数和公路长度。 接下来n行,每行两个整数di, ti,分别表示第i户家庭距离公路起点的距离和家庭中的人数。 【输出格式】 输出一行,包含一个整数,表示村内所有人路程的开销和。 【样例输入】 6 10 5 20 1 3 2 2 4 5 6 5 8 7 【样例输出】 18 【样例说明】 在距起点2, 5, 8, 10这4个地方集会,6个家庭需要的走的距离分别为1, 0, 1, 0, 2, 0,总的路程开销为1*3+0*2+1*5+0*20+2*5+0*7=18。 【数据规模与约定】 对于10%的评测数据,1<=n<=300。 对于30%的评测数据,1<=n<=2000,1<=L<=10000,0<=di<=L,di<=di+1,0<=ti<=20。 对于100%的评测数据,1<=n<=100000,1<=L<=1000000,0<=di<=L,di<=di+1,0<=ti<=1000000。 资源约定: 峰值内存消耗(含虚拟机) < 512M CPU消耗  < 8000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

枚举所有的可能性,求结果值然后取最小即可;

package 总决赛; import java.io.*; import java.util.Collections; import java.util.Scanner; import java.util.HashSet; public class 居民集会 { static boolean vis[]; static int L;//公路长度 static int lc = 0;//路程开销 static HashSet<Integer>hs = new HashSet<Integer>(); static int min_value(int[][]a){//求出di的最小值 int min = a[0][0]; for(int i=1;i<a.length;i++){ if(a[i][0] < min) min = a[i][0]; } return min; } static int max_value(int[]a){// int max = a[0]; for(int i=1;i<a.length;i++){ if(a[i] > max) max = a[i]; } return max; } static void dfs(int[][]a,int[]l,int d){//l存四个点的位置 if(d >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; } } } hs.add(z); return; } for(int i =0;i<a.length;i++){ if(!vis[i]){ l[d++] = a[i][0]; dfs(a,l,d); d--; 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]; 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(hs); System.out.println(min); } }

转载请注明原文地址: https://www.6miu.com/read-15303.html

最新回复(0)