您的位置:首页 > 其它

51Nod - 1094 暴力 + map

2017-01-01 21:55 148 查看

题意:

一整数数列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


思路:

直接暴力,然后用map优化,枚举每个数当作区间的右端点,然后查找map得到左端点,维护端点最小值

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e4 + 10;
const int INF = 0x3f3f3f3f;

ll a[MAXN], sum[MAXN];

int main() {
int n;
ll k;
scanf("%d%I64d", &n, &k);
map <ll, int> mp;
for (int i = 1; i <= n; i++) {
scanf("%I64d", &a[i]);
sum[i] = sum[i - 1] + a[i];
if (mp[sum[i]] == 0) mp[sum[i]] = i;
}
int l = INF, r = INF;
for (int i = 1; i <= n; i++) {
if (sum[i] == k) {
printf("%d %d\n", 1, i);
return 0;
}
int tmp = mp[sum[i] - k];
// printf("tmp == %d\n", tmp);
if (tmp != 0) {
if (tmp < l && tmp < i) l = tmp, r = i;
}
}
if (l == INF) puts("No Solution");
else printf("%d %d\n", l + 1, r);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51Nod acm 暴力 stl map