【CUGBACM15级BC第27场 B】hdu 5163 Taking Bus
2017-08-30 16:04
453 查看
Taking Bus
[align=center]Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1415 Accepted Submission(s): 490
[/align]
[align=left]Problem Description[/align]
Bestland has a very long road and there are
n
bus station along the road, which are numbered 1 to
n
from left to right. There are m
persons wanting to take the bus to some other station. You task is to find the time needed for each person. Note: All the other information you need is below. Please read the statment carefully.
[align=left]Input[/align]
There are multiple test cases. The first line of input contains an integer
T (1≤T≤60),
indicating the number of test cases. For each test case: The first line contains two integers
n and m (2≤n,m≤105),
indicating the number of bus stations and number of people. In the next line, there are
n−1
integers, d1,d2,…,dn−1
(1≤di≤109).
The i-th
integer means the distance between bus station i
and i+1
is di
(1≤i<n).
In the next m
lines, each contains two integers xi
and yi
(1≤xi,yi≤n,xi≠yi),
which means i-th
person is in bus station xi
and wants goto bus station yi.
(1≤i≤m)
What else you should know is that for the i-th
person, the bus starts at bus station ((i−1) mod n)+1
and drives to right. When the bus arrives at station
n,
it will turn around and drive from right to left. Similarly, When the bus arrives at station
1,
it will turn around and drive from left to right. You can assume that the bus drives one meter per second. And you should only consider the time that the bus drives and ignore the others.
[align=left]Output[/align]
For each person, you should output one integer which is the minimum time needed before arriving bus station
yi.
[align=left]Sample Input[/align]
1 7 3 2 3 4 3 4 5 1 7 4 5 5 4
[align=left]Sample Output[/align]
21
10
28
HintFor the first person, the bus starts at bus station 1, and the person takes in bus at time 0. After 21 seconds, the bus arrives at bus station 7. So the time needed is 21 seconds. For the second person, the bus starts at bus station 2. After 7 seconds, the bus arrives at bus station 4 and the person takes in the bus. After 3 seconds, the bus arrives at bus station 5. So the time needed is 10 seconds. For the third person, the bus starts at bus station 3. After 7 seconds, the bus arrives at bus station 5 and the person takes in the bus. After 9 seconds, the bus arrives at bus station 7 and the bus turns around. After 12 seconds, the bus arrives at bus station 4. So the time needed is 28 seconds.
问题描述
Bestland有一条非常长的马路,马路上设有n个公交汽车站。公交汽车站从左到右标号为1到n。有m个人想要乘公交。你的任务是找出每个人到终点为止所需要的时间。注意:你需要用来解决这道题目的信息在Input里面,请仔细阅读。输入描述
输入的第一行包含一个整数T (1≤T≤60),表示测试数据的组数。对于每组测试数据:第一行包含两个整数n和m (2≤n,m≤105),表示公交车站的数目和乘客的数目。 接下来一行包含n−1个整数, d1,d2,…,dn−1 (1≤di≤109). di表示第i个公交站和第i+1个公交站之间的距离。在接下来的m行, 每行包含两个整数xi和yi (1≤xi,yi≤n,xi≠yi), 表示第i个人时刻0的时候在第xi个公交站并且想要到第yi个公交站去。(1≤i≤m) 对于第i个人, 公交车在第((i−1) mod n)+1个公交站点在时刻0的时候,并且公交一开始往右开。公交到达站点n的时候会立刻转向往左开,同样当公交到达站点1的时候也会立刻转向往右开。你可以认为公交每秒只开一个单位距离,你只需要考虑公交开的时间。输出描述
对于每个人,输出到达yi个公交站点需要的最少时间。输入样例
1 7 3 2 3 4 3 4 5 1 7 4 5 5 4输出样例
21 10 28 提示: 对于第一个人, 公交在站点1出发, 然后这个人在时刻0上车。21秒之后,公交到达站点7。 对于第二个人,公交在站点2出发。7秒之后,公交到达站点4,这个人上车。之后又过了3秒,公交到达站点5.总共用了10秒。 对于第三个人,公交在站点3出发。7秒之后,公交到达站点5,这个人上车。之后过了9秒,公交达到站点7,然后转向开往站点0。之后经过12秒,公交达到站点4。因此总共需要28秒时间。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int sta[100005];//存取每个公交站点之间的距离 long long suml[100005];//计算每个公交站点到第一个公交站点的距离 long long sum[100005];//存取每一组数据所花费的最少时间; int main() { int T, n, m, start, end; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); long long num = 0; for (int i = 2; i <= n; i++) { scanf("%lld", &sta[i]); num += sta[i]; suml[i] = num; //处理每一个公交站点到第一个公交站点的距离; } for (int count = 1; count <= m; count++) //计数, { scanf("%d%d", &start, &end); int Staion = (count - 1) % n + 1;//第count个人要坐车时,公交车的起始站点位置; //最好画图模拟下,这是人的终点站点标号>起始站点标号,并且公交车的起始站点标号<=人的起始站点标号的情况; if (end > start && Staion <= start) { sum[count] = suml[end] - suml[Staion]; } //人的终点站点标号>起始站点标号,并且公交车的起始站点标号 > 人的起始站点标号的情况; else if (end > start && Staion > start) { sum[count] = 2 * suml - suml[Staion] + suml[end]; } //人的终点站点标号<起始站点标号,并且公交车的起始站点标号 > 人的起始站点标号或者公交车的起始站点标号<=人的起始站点标号的情况;; else if (start > end) { sum[count] = 2 * suml - suml[Staion] - suml[end]; } } for (int i = 1; i <= m; i++) { printf("%lld\n", sum[i]); } } return 0; }
相关文章推荐
- 【CUGBACM15级BC第27场 A】hdu 5162 Jump and Jump...
- 【CUGBACM15级BC第六场 A】hdu 4981 Goffi and Median
- 【CUGBACM15级BC第9场 B】hdu 4994 Revenge of Nim
- 【CUGBACM15级BC第23场 A】hdu 5146 Sequence
- 【CUGBACM15级BC第21场 A】hdu 5138 CET-6 test
- 【CUGBACM15级BC第六场 B】hdu 4982 Goffi and Squary Partition
- 【CUGBACM15级BC第15场 A】hdu 5083 Love
- 【CUGBACM15级BC第三场 A】hdu 4907 Task schedule
- 【CUGBACM15级BC第22场 A】hdu 5142 NPY and FFT
- 【CUGBACM15级BC第33场 B】hdu 5187 zhx's contest
- 【CUGBACM15级BC第三场 B】hdu 4908 BestCoder Sequence
- 【CUGBACM15级BC第23场 B】hdu 5147 Sequence II
- 【CUGBACM15级BC第11场 A】hdu 5054 Alice and Bob
- 【CUGBACM15级BC第22场 C】hdu 5144 NPY and shot
- 【CUGBACM15级BC第28场 A】hdu 5166 Missing number
- 【CUGBACM15级BC第五场 A】hdu 4956 Poor Hanamichi
- 【CUGBACM15级BC第18场 A】hdu 5104 Primes Problem
- 【CUGBACM15级BC第11场 B】hdu 5055 Bob and math problem
- 【CUGBACM15级BC第22场 B】hdu 5143 NPY and arithmetic progression
- 【CUGBACM15级BC第15场 B】hdu 5082 Instruction