标题:居民集会

蓝桥村的居民都生活在一条公路的边上,公路的长度为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. django获取某一个字段的列表 values values_list flat=true

    1.values() print(Question.objects.values('title')) #得到的是一个字典 <QuestionQuerySet [{'title': '查询优化之s ...

  2. 【CSP-S 2019】D2T2 划分

    Description 传送门 Solution 算法1 12pts 指数算法随便乱搞. 算法2 36pts \(O(n^3)\)dp. 设\(f_{i,j}\)表示以位置\(j\)结尾,上一个决策点 ...

  3. Go micro 入门

    路由跳转 官方文档 本质上是选择不同的方式将HTTP信息合理的转发至后端处理,而不同的方式相当于不同请求的接收器,接收后再将其转发至不同的后端服务,完成整个请求的调用. micro 将请求选择不同的方 ...

  4. vscode配置python环境-运行调试-windows环境

    官方文件介绍 https://code.visualstudio.com/docs/languages/python 准备: vscode下载安装 python3版本下载(安装时可以选择添加环境变量, ...

  5. 算法八字符串转换正数(atoi)

    请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之 ...

  6. Windows编译运行webrtc全过程

    年纪大了,不想写什么开头.摘要,咱直接开始吧. 不过首先还是要感谢声网提供的webrtc国内源码镜像. 首先,编译webrtc你需要一台win10,而且必须得是一直在更新版本的.因为编译过程需要用到c ...

  7. Flink是如何实现exactly-once语义的

    转自:https://blog.csdn.net/xianpanjia4616/article/details/86375224 最少一次:断了之后 重新执行 再去重 严格一次:根据检查点,再执行一次 ...

  8. Shell基本运算符之文件测试符

    文件测试运算符 ================摘自菜鸟教程================= 文件测试运算符用于检测UNIx文件的各种属性: 操作符 说明 例子 -b 检测文件是否是块设备文件,如果 ...

  9. Windows Terminal (Preview)治好了cmd,powershell的癌症

    前言 话说n年前,我想开发一款powershell麻将游戏,但是发现命令行下无法显示麻将牌这种特殊符号. 经过研究发现,这是4字节的utf16le字符串.而powershell依赖的渲染引擎,只能渲染 ...

  10. 使用Redis作为Spring Security OAuth2的token存储

    写在前边 本文对Spring Security OAuth2的token使用Redis保存,相比JWT实现的token存储,Redis可以随时吊销access_token,并且Redis响应速度很快, ...