标题:居民集会

蓝桥村的居民都生活在一条公路的边上,公路的长度为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. (转)idea创建Maven项目时Maven插件内看不到mybatis-generator

    转载地址:https://blog.csdn.net/yytwiligt/article/details/81010360 创建Maven项目时插件配置添加了mybatis-generator但是右侧 ...

  2. 题解:T103180 しろは的军训列队

    题目链接 solution: 按题目随便假设找到了一个x,它的位置的ap,属性bp 看下图 $$$$$$$$$$$$$$$$|||||P &&&&&&& ...

  3. CF1225C p-binary

    CF1225C p-binary 洛谷评测传送门 题目描述 Vasya will fancy any number as long as it is an integer power of two. ...

  4. Python thread (线程)

    线程 (thread) 操作系统最小的调度单位,是一串指令的集合 程序一开始就有一个主线程,新启动的线程和主线程之间互不影响,主线程启动子线程之后就相互独立(子线程也可以启动线程),无论子线程是否执行 ...

  5. 设计模式-单例模式(Singleton) (创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...

  6. FT_Get_Var error on comiling

    [Julian@julian-linux-t450 gtk]$ gcc `pkg-config --cflags gtk+-.` -o exam00 exam00.c `pkg-config --li ...

  7. 14 opencv读取XML

    https://blog.csdn.net/A_L_A_N/article/details/83272772 FileStorage类 FileStorage类将各种OpenCV数据结构的数据存储为X ...

  8. Vue v-for操作与computed结合功能

    <!doctype html> <html lang="en"> <head id="head"> <meta cha ...

  9. 认识一下transition

    transition 以前的CSS属性切换时,由于只有开始和截止两个状态,切换时略显生硬 jquery.animate 传说中的jquery在保证兼容性之后,又为开发者提供了简洁的过渡(动画其中之一效 ...

  10. 大话设计模式Python实现-外观模式

    外观模式(Facade Pattern):为子系统中的一组接口提供一个一致界面,此模式定义一个高层接口,使得子系统更加容易使用 下面是一个外观模式的demo: #!/usr/bin/env pytho ...