hdu 5163 Taking Bus
问题描述
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<stdio.h> #include<string.h> long long temp, dis[100005]; int main() { int T; scanf("%d", &T); while (T--) { int n, m; scanf("%d %d", &n, &m); dis[0] = 0; for (int i = 1; i < n; i++) { scanf("%lld", &temp); dis[i] = dis[i - 1] + temp; } long long ans = 0; for (int i = 1; i <= m; i++) { int begin = (i - 1) % n + 1; int a, b; scanf("%d %d", &a, &b); if (a > b) { ans = dis[n - 1] - dis[begin - 1] + dis[n - 1] - dis[b - 1]; //终点站在列车行驶的反方向 } else { if (begin > a) { ans = dis[n - 1] - dis[begin - 1] + dis[n - 1] + dis[b - 1]; //列车初始计时点大于乘客起始点 } else ans = dis[b - 1] - dis[begin - 1]; } printf("%lld\n", ans); } } return 0; }
时间: 2024-10-29 19:12:34