原题链接:http://ac.jobdu.com/problem.php?pid=1554

由数列的前缀和:$\begin{align*}\Large{} S_n &=\Large{}\sum_{i=1}^{n}{{a_i}} \ \ \ \ i=1,2,3...n\end{align*}$

由于:$\begin{align*}\Large{} S_n -S_{n-1}&=\Large{}a_n \end{align*}$

所以区间$\begin{align*}\Large{} [i,j]\end{align*}$ 之和,$\begin{align*}\Large{} S_j -S_{i-1}&=\Large{}a_i+a_{i+1}+...+a_j\ \ \ 1 \leq i,j,\leq n\end{align*}$

由题意给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整$\begin{align*}\Large{} k \end{align*}$

其实就是判断$\begin{align*}\Large{} Sum[j] -Sum[i]=k\end{align*}$是否成立。

暴力的方法直接枚举,由于$\begin{align*}\Large{} n=10000\end{align*}$会$\begin{align*}tle\end{align*}$。

现在我们换个思路,试试二分,考虑开个结构体数组,保存原数组的前缀和+原来的位置。

然后对其排序,再进行二分。但这样可能会出错,所以再判断一下,即可。

懒得啰嗦了,直接看代码吧。。

 #include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
using std::sort;
using std::lower_bound;
const int Max_N = ;
int arr[Max_N], sum[Max_N], temp[Max_N];
struct Node {
int v, pos;
bool operator<(const Node &x) const {
if (v == x.v) return pos < x.pos;
return v < x.v;
}
}rec[Max_N];
void solve(int n, int k) {
int p = ;
for (int i = ; i < n; i++) {
p = lower_bound(temp + , temp + n, sum[i] + k) - temp;
if (p == n && sum[n] != k) continue;
if (rec[p].pos > i && rec[p].v == sum[i] + k) {
printf("%d %d\n", i + , rec[p].pos);
return;
} else {
p++;
while (rec[p].v == sum[i] + k) {
if (rec[p].pos > i) {
printf("%d %d\n", i + , rec[p].pos);
return;
}
p++;
}
}
}
puts("No");
}
int main() {
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w+", stdout);
#endif
int n, k;
while (~scanf("%d", &n)) {
for (int i = ; i <= n; i++) {
scanf("%d", &arr[i]);
sum[i] = sum[i - ] + arr[i];
rec[i].v = sum[i], rec[i].pos = i;
}
scanf("%d", &k);
sort(rec + , rec + n);
for (int i = ; i <= n; i++) temp[i] = rec[i].v;
solve(n, k);
}
return ;
}

九度oj 1554 区间问题的更多相关文章

  1. 【九度OJ】题目1065:输出梯形 解题报告

    [九度OJ]题目1065:输出梯形 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1065 题目描述: 每组测试 ...

  2. 【九度OJ】题目1431:Sort 解题报告

    [九度OJ]题目1431:Sort 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1431 题目描述: 给你n个 ...

  3. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  4. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  5. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

  6. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  7. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  8. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  9. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

随机推荐

  1. 慕课网-安卓工程师初养成-2-11 Java常量

    来源:http://www.imooc.com/code/1256 所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变. 语法:final 常量名 = 值; 程序中使 ...

  2. IP一些基础知识

    1.主机IP地址 IP地址:internet上的每一台计算机都被赋予了唯一的32位Internet地址,简称ip地址. (1)IP地址的组成 IP地址由两部分组成,如图1 网络地址(net-ID) 主 ...

  3. sqool导出oracle数据

    set colsep '|'               --设置|为列分隔符 set echo off --在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句 set fee ...

  4. linux下LAMP环境搭建尝试

    最近,学习搭建了LAMP服务环境,中间遇到了很多问题,经过不断摸索总算得以解决.为了大家少走弯路,现将相关经验进行总结. linux下软件安装分为自动安装和手动安装两种,自动安装借助工具如yum等,自 ...

  5. oracle 闪回技术

    oracle默认不启动闪回数据库 如果需要启动闪回数据库,数据库需要设置为归档模式,并启用恢复区. 1.查看是否启动闪回删除 SQL> show parameter recyclebin; NA ...

  6. 华为OJ平台——矩阵乘法

    题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...

  7. Java之注解

    package com.demo.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementTy ...

  8. 微信JS-SDK]微信公众号JS开发之卡券领取功能详解

    js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...

  9. 值得推荐的C/C++框架和库(转)

    值得学习的C语言开源项目 C++ 资源大全 值得学习的C语言开源项目 1.Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我 ...

  10. 安装package.js