题目:题目108
开始想的是用常规方法加:
#include<iostream>
#include <math.h>
#include<stdlib.h>
using namespace std;
int kill[1000005];
int main()
{
int N,M,i,m,n,ans;
cin >> N >> M;
for (i = 0; i < N; i++)
cin >> kill[i];
while (M--)
{
ans = 0;
cin >> m>>n;
for (i = m-1; i < n; i++)
{
ans += kill[i];
}
cout << ans << endl;
}
return 0;
}
因为每给一个范围都要进行大片的加法,所以会导致超时。于是找题解找到一种方法优化了代码。
思路:在输入每一个士兵kill值时,累加,用s数组存储前i项和
当然,iostream.h也是超时,太严苛了2333,把cin,cout都放弃了就ac了
#include<stdio.h>
int kill[1000005],s[1000005];
int main()
{
int N,M,i,m,n;
scanf("%d %d", &N, &M);
s[0] = 0;
for (i = 1; i <= N; i++)
{
scanf("%d", &kill[i]);
s[i] = s[i - 1] + kill[i];
}
while (M--)
{
scanf("%d %d", &m, &n);
printf("%d\n", s[n] - s[m - 1]);
}
return 0;
}