码迷,mamicode.com
首页 > 其他好文 > 详细

九度 OJ 1554:区间问题 (set +前缀 +map)

时间:2015-03-17 15:53:19      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:set map

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:3468

解决:291

题目描述:

给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数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
来源:
2014年王道论坛计算机考研机试全真模拟考试





#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>


#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)

#define eps 1e-8
//typedef __int64 ll;

#define fre(i,a,b)  for(i = a; i < b; i++)
#define free(i,a,b) for(i = a; i >= b;i--)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define ssf(n)      scanf("%s", n)
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define bug         pf("Hi\n")

using namespace std;

#define INF 0x3f3f3f3f
#define N 100005


int n;
int sum[N],k;
int a[N];

set<int>le;
map<int ,int>mp;

void solve()
{
	int i,j;
    le.clear();
    mp.clear();

    bool flag=false;
    int s,e;

	free(i,n,1)
	{
	   le.insert(sum[i]);
	   mp[sum[i]]=i;

	   if(le.find(sum[i-1]+k)!=le.end())
	   {
	   	  s=i;
	   	  e=mp[sum[i-1]+k];
	   	  flag=true;
	   }
	}
    if(flag) pf("%d %d\n",s,e);
    else pf("No\n");
}

int main()
{
	   int i,j,t,ca=0;
	   while(~scanf("%d",&n))
	   {
	   	fre(i,1,n+1)
		 {
		    sf(a[i]);
			sum[i]=sum[i-1]+a[i];
		 }
	   sf(k);
       solve();

	   }
    return 0;
}


九度 OJ 1554:区间问题 (set +前缀 +map)

标签:set map

原文地址:http://blog.csdn.net/u014737310/article/details/44342127

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!