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

标题:居民集会
蓝桥村的居民都生活在一条公路的边上,公路的长度为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);
	}

}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值