乘车

来源:互联网 发布:招人软件 编辑:程序博客网 时间:2024/04/29 04:14

【题目描述】
周末,小华和妈妈一道去乡下的外婆家,有路公交车正好直达,他们打算乘公交车到外婆家。细心的小华发现公交车一共要经过 n+1 个站点,起点是 0 号站点,终点站是 n,并且每个站点的距离不一样,所以每一站的乘车费用也不尽相同。
现在小华在思考一个问题:从起点站开始到 n 号站点陆陆续续共有 m 个人乘车,已知这m 个人乘车区间,以及相邻两站(i-1 站到 i 站)的乘车费用,那么在这一趟单程车次中,售票员一共卖出多少票额的车票。一个人乘车费用是他在乘车区间各站费用之和。
【输入格式】
第一行,一个空格隔开的两个正整数 n 和 m。
第二行,有 n 个正整数,各数之间用一个空格隔开,第 i 个数表示站点 i-1 到站点 i 之间的乘车费用(费用 100 以内正整数)。
接下来,有 m 行,每一行两个整数,描述了 m 个人乘车区间站点信息(上车和下车的站点)。
【输出格式】
总共卖出的票额。
【样例输入】
5 3
2 3 2 4 3
0 2
3 5
1 4
【样例输出】
21
【数据范围】
2n1000001m10000
【分析】
用前缀和累加第0站到第i站的票额之和,然后边读入边统计即可,当然用差分也可以。

//前缀和#include<bits/stdc++.h>using namespace std;int a[100005],b[100005]={0};int n,m;int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=b[i-1]+a[i];    long long ans=0;    for (int i=1;i<=m;i++){        int x,y;        scanf("%d%d",&x,&y);        ans+=b[y]-b[x];    }    printf("%lld",ans);}-----------------------------------//差分#include<bits/stdc++.h>using namespace std;int a[100005],b[100005]={0};int n,m;int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++) scanf("%d",&a[i]);    for (int i=1;i<=m;i++){        int x,y;        scanf("%d%d",&x,&y);        b[x+1]++,b[y+1]--;    }    for (int i=1;i<=n;i++) b[i]=b[i]+b[i-1];    long long ans=0;    for (int i=1;i<=n;i++) ans+=a[i]*b[i];    printf("%lld",ans);}
原创粉丝点击