51nod 1094 和为k的连续区间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BBHHTT/article/details/82117483

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;
}

猜你喜欢

转载自blog.csdn.net/BBHHTT/article/details/82117483
今日推荐