士兵杀敌(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。
小工是南将军手下的军师,南将军现在想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。
注意,南将军可能会问很多次问题。
- 输入
- 只有一组测试数据
第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示南将军询问的次数(1<M<100000)
随后的一行是N个整数,ai表示第i号士兵杀敌数目。(0<=ai<=100)
随后的M行每行有两个整数m,n,表示南将军想知道第m号到第n号士兵的总杀敌数(1<=m,n<=N)。 - 输出
- 对于每一个询问,输出总杀敌数
每个输出占一行 - 样例输入
-
5 2 1 2 3 4 5 1 3 2 4
- 样例输出
-
6 9
#include<stdio.h> #include<malloc.h> int main(){ int P,N,M,m,n,i,j,s=0,*p=(int *)malloc(1000000*sizeof(int)), *q=(int *)malloc(1000000*sizeof(int)); scanf("%d%d",&N,&M); for(i=1;i<=N;i++) { scanf("%d",&p[i]); } for(i=1;i<=N;i++){ if(p[i]>0&&p[i]<=100){ for(P=0;P<M;P++){ scanf("%d%d",&m,&n); if(m>=1&&n<=N){ for(j=m;j<=n;j++) { q[P]+=p[j]; }} }} for(P=0;P<M;P++) printf("%d ",q[P]);} free(p); free(q); return 0; }
错误信息
运行时间:2016-12-11 21:49:20 | 用户:张子木程序运行超时:
你的程序太慢了,想想办法改进一下速度吧。。
在测试数据很多(几百万个数),而你又用的cin,cout进行输入输出时,也可能会出现超时,改成scanf,printf即可
也有可能是你的程序陷入了死循环不能退出了我想哭。。。。。。怎么了是。。。。于是我百度了一下,得到一个代码#include <stdio.h> #include <stdlib.h> #include <string.h> int a[1123456]; int sum[1123456]; int main() { int n, m; scanf("%d %d", &n, &m); int i; for(i = 1;i <= n;i++){ scanf("%d", &a[i]); sum[i] = sum[i-1]+a[i]; } int a, b; for(i = 0;i < m;i++){ scanf("%d %d", &a, &b); printf("%d ", sum[b]-sum[a-1]); } return 0; }
然后我就醉了。。。
我之前也是这样写的,但是一运行就停止运行的,然后想到可能是数组的长度太大了,然后把数组大小变成了10,确实运行正常。。
可是上面这个好像比我的还要大啊。。。。。
下面是我之前的
#include<stdio.h> #include<Windows.h> int main(){ int p,N,M,m,n,i,j,s=0,a[1000000]={0},b[1000000]={0}; scanf("%d%d",&N,&M); for(i=1;i<=N;i++) { scanf("%d",&a[i]); if(a[i]<0||a[i]>100) exit(0);
} for(p=0;p<M;p++){
scanf("%d%d",&m,&n);
if(m<1||n>N) exit(0);
for(j=m;j<=n;j++) {
b[p]+=a[j];
} } for(p=0;p<M;p++) printf("%d ",b[p]); return 0; }