区间和问题——九度 1554

对应 九度 题目:点击打开链接

题目描述:

给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数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

思路:sum[i] 表示前i项和,题意即变为求是否存在 sum[i] - sum[j-1] == k,直接枚举无法通过。把式子转化一下可变为:sum[i] == sum[j-1] + k;题意又变为求是否存在一个sum[i] 使sum[j-1] + k == sum[i] 成立。这样直接过一遍就可以了。在不考虑前缀和相同的情况,用map标记就可以完成查找工作,如果存在前缀和相同的情况,用个vector容器跟每个前缀和对应就可以了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <map>
#include <vector>
#define M 10010
#define OFFSET 1000000
#define MIN(x, y) ((x) < (y) ? (x) : (y))
int sum[M];
using namespace std;
vector<int>cnt[M];

int main()
{
    //freopen("in.txt", "r", stdin);
    int n;
    int i, j, k, a, t, s, u;
    while(~scanf("%d", &n))
    {
        u = 1;
        map<int, int>vis;
        memset(sum, 0, sizeof(sum));
        for(i=0; i<n; i++){
            scanf("%d", &a);
            s = sum[i+1] = sum[i] + a;
            if(vis.find(s) == vis.end())
                vis[s] = u++;
            cnt[vis[s]].push_back(i + 1);
        }
        scanf("%d", &k);
        if(abs(k) > OFFSET){
            printf("No\n");
            continue;
        }
        int left = 0, right = 0;
        int flag = 0;
        for(i=1; i<=n; i++){
            t = sum[i-1] + k;
            if(vis[t]){
                int b = vis[t];
                for(j=0; j<cnt[b].size(); j++){
                    if(cnt[b][j] >= i){
                        flag = 1;
                        left = i;
                        right = cnt[b][j];
                        break;
                    }
                }
                if(flag) break;
            }
        }
        if(flag) printf("%d %d\n", left, right);
        else printf("No\n");
        for(i=0; i<M; i++)
            cnt[i].clear();
    }
    return 0;
}
时间: 2024-10-26 08:19:05

区间和问题——九度 1554的相关文章

OJ-2:区间问题【九度1554】

  题目描述: 给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数k. 输入: 输入包含多组测试用例,每组测试用例由一个整数n(1<=n<=10000)开头,代表数组的大小. 接下去一行为n个整数,描述这个数组,整数绝对值不大于100. 最后一行为一个整数k(大小在int范围内). 输出: 对于每组测试用例,若存在这个连续区间,输出其开始和结束的位置,s,e(s <= e). 若存在多个符合条件的输出,则输出s较小的那个,若仍然存在多个,输出e较小的那个. 若不存在,直

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输

九度 1203

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度 1205

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度 1351 只出现一次的数

#include <cstdio> #include <iostream> using namespace std; #ifdef ONLINE_JUDGE #define FINPUT(file) 0 #define FOUTPUT(file) 0 #else #define FINPUT(file) freopen(file,"r",stdin) #define FOUTPUT(file) freopen(file,"w",stdout)

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名