CODE[VS] 2291 糖果堆

题目描述 Description

【Shadow 1】第一题

WJMZBMR买了很多糖果,分成了N堆,排成一列。WJMZBMR说,如果Shadow能迅速求出第L堆到第R堆一共有多少糖果,就把这些糖果都给他。

现在给出每堆糖果的数量,以及每次询问的L和R,你需要帮助Shadow,把每次询问的结果求出来。注意,你不需要考虑糖果被Shadow取走的情况。

 

输入描述 Input Description

第1行,2的整数N,M,分别表示堆数和询问数量;

第2行,N个整数Ai,表示第i堆糖果的数量;

第3-(M+2)行,每行2个整数Li, Ri,表示第i个询问是[Li, Ri]。

输出描述 Output Description

M行,对于每个询问,输出对应的和。

 

样例输入 Sample Input
5 5
1 2 3 4 5
1 5
2 4
3 3
1 3
3 5
样例输出 Sample Output
15
9
3
6
12
 
数据范围及提示 Data Size & Hint

对于50%的数据,1≤N,M≤100;
对于100%的数据,1≤N,M≤100000,0≤Ai≤1000,1≤Li≤Ri≤N。

 

海琴烟太美了。

鬼刀必大火。2333

 

这题乍一看,,挺简单的。

第一思路应该就是纯模拟吧。

 

循环输入l,r

再从l到r加起来,输出。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int n,m,a[100002],l,r,ans;
 9 
10 int main()
11 {
12     scanf("%d%d",&n,&m);
13     for(int i=1;i<=n;++i)
14         scanf("%d",&a[i]);
15     for(int i=1;i<=m;++i)
16     {
17         scanf("%d%d",&l,&r);
18         for(int j=l;j<=r;++j)
19         {
20             ans+=a[j];
21         }
22         printf("%d\n",ans);
23         ans=0;
24     }    
25     return 0;
26     
27 }
纯模拟TLE

 

但是数据范围太大了,会t啊!

 

像这样,只有42分。

 

那么,我只能去借鉴别人的另外思路了。。

可以通过一些方法来减少循环次数嘛,

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 int n,m,a[100002],l,r,sum[100002];
 9 
10 int main()
11 {
12     scanf("%d%d",&n,&m);
13     for(int i=1;i<=n;++i)
14     {
15         scanf("%d",&a[i]);
16         sum[i]=sum[i-1]+a[i];
17     }    
18     while(m--)
19     {
20         scanf("%d%d",&l,&r);
21         printf("%d\n",sum[r]-sum[l-1]);
22     }
23     return 0;    
24 }
像这样,巧用数组

 

 

 

posted @ 2018-06-10 06:47  孟东行#  阅读(292)  评论(0编辑  收藏  举报