HDU 5163 Taking Bus

来源:互联网 发布:考研英语培训机构 知乎 编辑:程序博客网 时间:2024/05/18 00:39

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5163

问题描述

Bestland有一条非常长的马路,马路上设有n个公交汽车站。公交汽车站从左到右标号为1到n。有m个人想要乘公交。你的任务是找出每个人到终点为止所需要的时间。注意:你需要用来解决这道题目的信息在Input里面,请仔细阅读。
输入描述

输入的第一行包含一个整数T (1T60),表示测试数据的组数。对于每组测试数据:第一行包含两个整数nm (2n,m105),表示公交车站的数目和乘客的数目。 接下来一行包含n1个整数, d1,d2,,dn1 (1di109).  di表示第i个公交站和第i+1个公交站之间的距离。在接下来的m行, 每行包含两个整数xiyi (1xi,yin,xiyi), 表示第i个人时刻0的时候在第xi个公交站并且想要到第yi个公交站去。(1im)对于第i个人, 公交车在第((i1) mod n)+1个公交站点在时刻0的时候,并且公交一开始往右开。公交到达站点n的时候会立刻转向往左开,同样当公交到达站点1的时候也会立刻转向往右开。你可以认为公交每秒只开一个单位距离,你只需要考虑公交开的时间。
输出描述

对于每个人,输出到达yi个公交站点需要的最少时间。
输入样例

17 32 3 4 3 4 51 74 55 4
输出样例

211028提示:对于第一个人, 公交在站点1出发, 然后这个人在时刻0上车。21秒之后,公交到达站点7。对于第二个人,公交在站点2出发。7秒之后,公交到达站点4,这个人上车。之后又过了3秒,公交到达站点5.总共用了10秒。对于第三个人,公交在站点3出发。7秒之后,公交到达站点5,这个人上车。之后过了9秒,公交达到站点7,然后转向开往站点0。之后经过12秒,公交达到站点4。因此总共需要28秒时间。
代码:

#include<iostream>#include<cstdio>using namespace std;__int64 tt[100005];__int64 sum[100005];int main(){    int t;    scanf("%d",&t);    int n,m;    int x,y;    while(t--)    {        scanf("%d %d",&n,&m);        tt[1]=tt[0]=0;        for(int i=2;i<=n;i++)        {            scanf("%I64d",&tt[i]);            tt[i]=tt[i-1]+tt[i];        }        for(int i=1;i<=m;i++)        {            scanf("%d %d",&x,&y);            int now=(i-1)%n+1;            if(now<=x && x<y)                sum[i]=tt[y]-tt[now];            if(now>x && x<y)              sum[i]=2*tt[n]-tt[now]+tt[y];            if(y<x)                sum[i]=2*tt[n]-tt[now]-tt[y];        }        for(int i=1;i<=m;i++)            printf("%I64d\n",sum[i]);    }     return 0;}


0 0
原创粉丝点击