题目1554:区间问题

时间限制:1

内存限制:128

特殊判题:

提交:1889

解决:173

题目描述:

给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数k

输入:

输入包含多组测试用例,每组测试用例由一个整数n(1<=n<=10000)开头,代表数组的大小。
接下去一行为n个整数,描述这个数组,整数绝对值不大于100
最后一行为一个整数k(大小在int范围内)

输出:

对于每组测试用例,若存在这个连续区间,输出其开始和结束的位置,se(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 
****************************************************************/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值