您的位置:首页 > 其它

【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 模拟