标题:居民集会

蓝桥村的居民都生活在一条公路的边上,公路的长度为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
1 3
2 2
4 5
5 20
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消耗 < 5000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的

多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操

作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不

能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。


很努力的题解:

  思路大致就是,前三个集合地点肯定是要建在某个人的家里,这样可能更加省时;把这个区间整体分成四份就可以了,然后把每份区间用for循环跑一遍,分别命名为区间1、区间2、区间3、区间4;

  区间1--4:s1是【1,i】,s2是【i+1,j】,s3是【j+1,k】,s4是【k+1,n+1】;(n+1也就是路的终点的地方)

优化的问题:

  跑for循环时间说炸就炸了,可以通过预处理,在O(n)的时间范围内处理出来;最后在跑的时候可以适当剪掉一些情况,例如s1或者s1+s2要是已经超过了ans就continue。

注:下面的num[i]表示1——i的家庭的人口总数。

 #include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<algorithm>
#include<set>
#include<string.h>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define N 100008
#define ll long long
#define ull unsigned long long
#define inf 0x3f3f3f3f
struct node{
ll dis,num;
}p[N];
ll num[N],d[N];//d[i]表示p[i]到p[i-1]的距离
ll s4[N]; int main(){
int n;
ll L;
scanf("%d%I64d",&n,&L);
int x,y;
num[]=0ll;
for(int i=;i<=n;i++){
num[i]=0ll;
scanf("%I64d%I64d",&p[i].dis,&p[i].num);
num[i]=num[i-]+p[i].num;
if(i==)d[i]=;
else d[i]=p[i].dis-p[i-].dis;
}
p[n+].dis=L;p[n+].num=;
if(n<=){
printf("0\n");
}
else{
s4[n+]=;
for(int i=n;i>=;i--){//从i点到n+1点所有人需要走到s4的距离
s4[i]=s4[i+]+ (p[n+].dis-p[i].dis)*p[i].num;
} ll ans=(ll)inf*;
ll s1=,s2=,s3=;
for(int i=;i<=n-;i++){//暴力枚举三个点的位置
s1+= num[i-]*d[i];
s2=;
if(s1>=ans)continue;
for(int j=i+;j<=n-;j++){
s2+= ( num[j-]-num[i])*d[j];
s3=;
if(s1+s2>=ans)continue;
for(int k=j+;k<=n;k++){
s3+=(num[k-]-num[j])*d[k];
ll s=s4[k+];//表示最后一段的结果
if(ans>s1+s2+s3+s){
// printf("%d %d %d %d\n",i,j,k,n+1);输出新区间
ans=s1+s2+s3+s;
}
}
}
}
printf("%I64d\n",ans);
} return ;
}

(仅供参考,开心就好)

2015年第六届蓝桥杯C/C++程序设计本科B组决赛 ——居民集会(编程大题)的更多相关文章

  1. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛

    1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C.为了促销,每件商品都会返固定 ...

  2. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形

    完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形.历史上,人们花了很久才找到了若干完美正方形.比如:如下边长的22个正方形 2 3 4 6 7 8 12 13 ...

  3. 第七届蓝桥杯C/C++程序设计本科B组决赛 ——机器人塔(程序大题)

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B.他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A BA B A B B A 队内的组塔规则是: A 只 ...

  4. 第八届蓝桥杯C/C++程序设计本科B组决赛 ——发现环(编程大题_签到题_tarjan判环)

    标题:发现环 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管理员误操 ...

  5. 2016年第六届蓝桥杯C/C++程序设计本科B组决赛 ——一步之遥(填空题题)

    一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里.矿车停在平直的废弃的轨道上.他的面前是两个按钮,分别写着“F”和“B”. 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退.按F,会 ...

  6. 第七届蓝桥杯C/C++程序设计本科B组决赛 ——凑平方数(填空题)

    凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的.比如:0, 36, 5948721 再比如:10985247361, 25, 63907840, 4, 289, 1 ...

  7. 2016年第七届蓝桥杯C/C++程序设计本科B组决赛

    2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...

  8. 第七届蓝桥杯C/C++程序设计本科B组决赛 ——棋子换位(代码补全题)

    棋子换位 有n个棋子A,n个棋子B,在棋盘上排成一行.它们中间隔着一个空位,用“.”表示,比如: AAA.BBB 现在需要所有的A棋子和B棋子交换位置.移动棋子的规则是:1. A棋子只能往右边移动,B ...

  9. 2016年第七届蓝桥杯C/C++程序设计本科B组省赛

    /* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...

随机推荐

  1. 4. gitlab 安装、项目创建

    官网: https://about.gitlab.com/ https://docs.gitlab.com/omnibus/maintenance/README.html#get-service-st ...

  2. 简述ECMAScript6新增特性

    1.变量 var 可以重复声明.只有函数级的作用域.存在变量提升 let 不能重复声明.有块级作用域.没有变量提升.变量 const 不能重复声明.具有块级作用域.常量 2.箭头函数 a.为了方便而存 ...

  3. Jmeter请求

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web=& ...

  4. lua 1 基本语法和注意事项

    笔记总结自: http://www.runoob.com/lua/lua-data-types.html 基本数据类型: 数据类型 描述 nil 这个最简单,只有值nil属于该类,表示一个无效值(在条 ...

  5. 工具资源系列之给 windows 虚拟机装个 windows

    前面我们已经介绍了如何在 Windows 宿主机安装 VMware 虚拟机,这节我们将利用安装好的 VMware 软件安装 Windows 系统. 前情回顾 虚拟机是相对于真实的物理机而言的概念,是在 ...

  6. sql server 下载安装标记

    SQL Server 2017 的各版本和支持的功能 https://docs.microsoft.com/zh-cn/sql/sql-server/editions-and-components-o ...

  7. A query was run and no Result Maps were found for the Mapped Statement

    mybatis测试方法报错: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exec ...

  8. RHCE实验记录总结-2-RHCE

    RHCSA实验总结-点击跳转 RHCE实验 RHCE这边我简单分了下类: ## 网络与安全 1. IPv6 设置(推荐使用GUI程序 nm-connection-editor来完成) 2. team ...

  9. DAX 第四篇:CALCULATE详解

    CALCULATE()函数是DAX中最复杂的函数,用于计算由指定过滤器修改的上下文中的表达式. CALCULATE(<expression>,<filter1>,<fil ...

  10. Enum.GetValues(),返回System.Array的一个实例

    Array enumData = Enum.GetValues(e.GetType()); Console.WriteLine("This enum has {0} members.&quo ...