时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:1889
解决:173
题目描述:
给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数k。
输入:
输入包含多组测试用例,每组测试用例由一个整数n(1<=n<=10000)开头,代表数组的大小。
接下去一行为n个整数,描述这个数组,整数绝对值不大于100。
最后一行为一个整数k(大小在int范围内)。
输出:
对于每组测试用例,若存在这个连续区间,输出其开始和结束的位置,s,e(s <= e)。
若存在多个符合条件的输出,则输出s较小的那个,若仍然存在多个,输出e较小的那个。
若不存在,直接输出"No"。
样例输入:
5
-1 2 3 -4 9
5
3
-1 2 -3
7
2
-1 1
0
样例输出:
2 3
No
1 2
//1554
#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
const int MAX = 10005;
int arr[MAX];
int sum[MAX];
typedef long long LL;
const int INF = 0x7f7f7f7f;
int
main(void)
{
int N;
LL key;
while(~scanf("%d",&N))
{
int i;
//求和
sum[0]=0;
for(i=1;i<=N;i++)
{
scanf("%d",arr+i);
sum[i]=sum[i-1]+arr[i];
}
scanf("%lld",&key);
int start = INF;
int end = INF;
map<LL,int> mp;
for(i=N;i>=0;i--)
{
LL temp = sum[i]+key;
if(mp.find(temp) != mp.end())
{
start = i+1;
end = mp[temp];
}
mp[sum[i]]=i;
}
if(start == INF)
printf("No\n");
else
printf("%d %d\n",start,end);
}
return 0;
}
/**************************************************************
Problem: 1554
User: ranchothu
Language: C++
Result: Accepted
Time:660 ms
Memory:1996 kb
****************************************************************/