2433. Measuring Traffic

2433. Measuring Traffic

题目描述

Farmer John的农场边上的高速公路最近出现了引人注目的流量上升,或者至少Farmer John看起来是这样的。为了证实这件事,他打算用一组传感器测量公路上的车流量,每个传感器被用来测量一小段路面上的车流量的数值。
不幸的是,某一天经过牛棚的时候,Farmer John被绊倒了,装有传感器的盒子掉进了一个巨大的奶缸,之后它们就不能正常工作了。比起之前可以产生一个精确的车流量读数,现在每个传感器只能输出一个可能结果的范围。例如,一个传感器可能会给出范围[7,13],表示在这段路面上的车流量不小于7,并且不大于13。
高速公路经过农场的这一段长N英里,车辆仅从一个方向通过公路,从第1英里驶向第N英里。Farmer John想要安装N个传感器——每一个监测高速公路上1英里长的路段。在其中某些路段上,有能够使得车辆进入高速公路的上匝道;在所有这样的路段上,Farmer John会将传感器装在上匝道上,测量流入的(近似)车流量。在某些路段上有能够使得车辆离开高速公路的下匝道;在所有这样的路段上,Farmer John会将传感器装在下匝道上。每一个路段包含至多一个匝道。如果在公路的一个路段上没有上匝道或下匝道,Farmer John就将传感器装在高速公路的主路上。
给定Farmer John的N个传感器的读数,请求出在高速公路第1英里之前和第N英里之后车流量的最为准确的可能范围。这些范围应当与所有N个传感器的读数相一致。

输入
输入的第一行包含N(1≤N≤100)。余下N行每行按从第1英里至第N英里的顺序描述一段1英里长的路段。每行包含一个字符串,为"on"(如果这段路上有一个上匝道),“off”(如果这段路上有一个下匝道),或者是"none"(如果这段路上没有匝道),然后是两个范围为0…1000的整数,表示这段路上的传感器的读数所给出的下界、上界。如果这段路上包含匝道,传感器读数来自于匝道,否则来自于主路。至少一个高速公路路段的描述会是"none"。

输出
输出的第一行包含两个整数,为第1英里之前的车流量的最准确的可能范围。第二行包含两个整数,为第N英里之后的车流量的最准确的可能范围。输入保证存在符合要求的解。

样例输入

4
on 1 1
none 10 14
none 11 15
off 2 3

样例输出

10 13
8 12

提示
在这个例子中,路段2和路段3的读数组合在一起告诉我们通过这两个路段的车流量为范围[11,14]之间的某个值,因为只有这个范围与两个读数[10,14]和[11,15]均一致。在第1英里,恰有1单位的车辆通过上匝道进入,所以在第1英里之前,车流量一定在范围[10,13]之内。在第4英里,2单位到3单位之间的车辆通过下匝道离开,所以这段路之后可能的车流量范围为[8,12]。

思路:
正向可推出第N英里之后的车流量的最准确的可能范围。

反向可推出第1英里之前的车流量的最准确的可能范围。

想象一下高速公路的情况,从A->B地,去时的出口,回来时就变成了入口。

  1. 如果是入口,l+=p[i].l,r+=p[i].r;假设入口最少上了5辆,最多上了10辆,上一个点的l=10,r=30;那么此时公路上最小有15辆(因为最少增了5辆),最多有40辆(因为最多增了10辆);

  2. 如果是出口,l-=p[i].r,r-=p[i].l;假设出口最少下了5辆,最多下了10辆,上一个点的l=10,r=30;那么此时公路上最小有0辆(因为最多下了10辆),最多有25辆(因为最少下了5辆);
    注意:l最小为0,不能为负

  3. 如果传感器在公路上,l=max(l,p[i].l),r=min(r,p[i].r)举个栗子:妈妈问:“爸爸吃了几碗饭?”。弟弟道:“最少1碗,最多4碗”,哥哥说:“最少2碗,最多5碗。”,如果哥俩描述正确,那妈妈就能得出结论“最少吃2碗,最多吃4碗。”

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e3+10;
struct node
{
	string flag;
	int l,r;
} p[N];
int n,l=0,r=1000;
void input()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) cin>>p[i].flag>>p[i].l>>p[i].r;
}
void st()
{
	for(int i=n;i>=1;i--)
	{
		if(p[i].flag=="none") 
			l=max(l,p[i].l),r=min(r,p[i].r);
		if(p[i].flag=="on")
			l-=p[i].r,r-=p[i].l;
//反推时候,p[i].l和p[i].r,也要反过来,我原本:l-=p[i].l,r-=p[i].r;
		if(p[i].flag=="off")
			l+=p[i].l,r+=p[i].r;
		l=max(0,l);
	}
	printf("%d %d\n",l,r);
}
void ed()
{
	for(int i=1;i<=n;i++)
	{
		if(p[i].flag=="none") 
			l=max(l,p[i].l),r=min(r,p[i].r);
		if(p[i].flag=="on")
			l+=p[i].l,r+=p[i].r;
		if(p[i].flag=="off")
			l-=p[i].r,r-=p[i].l;
		l=max(0,l);
	}
	printf("%d %d\n",l,r);
}
int main()
{
	//fre(traffic);
	input();
	st();
	ed();
	return 0;
}

原创文章 157 获赞 148 访问量 8307

猜你喜欢

转载自blog.csdn.net/bigwinner888/article/details/105868649