1094 和为k的连续区间
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 <= i <= j <= n),使得a[i] + ... + a[j] = k。
Input
第1行:2个数N,K。N为数列的长度。K为需要求的和。(2 <= N <= 10000,-10^9 <= K <= 10^9) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)。
Output
如果没有这样的序列输出No Solution。 输出2个数i, j,分别是区间的起始和结束位置。如果存在多个,输出i最小的。如果i相等,输出j最小的。
Input示例
6 10 1 2 3 4 5 6
Output示例
1 4
思路:输入的时候记录前缀和,然后遍历相减看是否==k。
另:好奇为什么分类在数据结构上,看了别人的利用map做的,更巧妙一点,时间复杂度更小。在计算前缀和的时候可以map[sum[i] ]++,这样我们在第一层遍历的时候,可以判断if( map[ sum[i] +k ] )如果成立才进行第二层for,这样便利的次数少了,进行第二层for一定会有解。
#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long
ll mat[10005];
int main()
{
ll k, n;
scanf("%lld%lld",&n,&k);
ll a;
mat[0]=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a);
mat[i]=mat[i-1]+a;
}
for(int i=0;i<n;i++) {
for(int j=i+1;j<=n;j++) {
if((mat[j]-mat[i] )== k) {
printf("%d %d\n",i+1,j);
return 0;
}
}
}
printf("No Solution\n");
return 0;
}