51nod 1094STL和为k的连续区间
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1094STL和为k的连续区间相关的知识,希望对你有一定的参考价值。
和为k的连续区间
题目
一整数数列a[1], a[2], … , a[n](有正有负),以及另一个整数k,求一个区间[i, j],(1 <= i <= j <= n),使得a[i] + … + a[j] = k。
输入
第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)。
输出
如果没有这样的序列输出No Solution。
输出2个数i, j,分别是区间的起始和结束位置。如果存在多个,输出i最小的。如果i相等,输出j最小的。
输入样例
6 10
1
2
3
4
5
6
输出样例
1 4
解题思路
做前缀和,把每个前缀和的下标丢进map里,map[sum] = i
如果 sum - k 是存在的,就表示 map[sum - k] + 1 到 i 的和等于 k
记录下合法区间,从小到大排序
为什么加一
5 12
1 2 3 4 5
15(1到5) - 3(1到2) = 12
2不在区间内,所以要+1
ans:3 5
Code
#include <bits/stdc++.h>
#define N 10000
using namespace std;
int n, k, sum, a[N + 200];
map<int, int> M;
vector<pair<int, int> > v;
int main()
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
M[0] = 0;
for(int i = 1; i <= n; i ++)
sum = sum + a[i];
map<int, int>::iterator it;
it = M.find(sum);
if(it == M.end())
M[sum] = i;
it = M.find(sum - k);
if(it != M.end())
v.push_back( make_pair(it -> second + 1, i) );
sort(v.begin(), v.end());
if(v.size() == 0)
printf("No Solution");
else printf("%d %d", v[0].first, v[0].second);
以上是关于51nod 1094STL和为k的连续区间的主要内容,如果未能解决你的问题,请参考以下文章