原题链接: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*}$。

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

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

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

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cstdio>
  6. using std::sort;
  7. using std::lower_bound;
  8. const int Max_N = ;
  9. int arr[Max_N], sum[Max_N], temp[Max_N];
  10. struct Node {
  11. int v, pos;
  12. bool operator<(const Node &x) const {
  13. if (v == x.v) return pos < x.pos;
  14. return v < x.v;
  15. }
  16. }rec[Max_N];
  17. void solve(int n, int k) {
  18. int p = ;
  19. for (int i = ; i < n; i++) {
  20. p = lower_bound(temp + , temp + n, sum[i] + k) - temp;
  21. if (p == n && sum[n] != k) continue;
  22. if (rec[p].pos > i && rec[p].v == sum[i] + k) {
  23. printf("%d %d\n", i + , rec[p].pos);
  24. return;
  25. } else {
  26. p++;
  27. while (rec[p].v == sum[i] + k) {
  28. if (rec[p].pos > i) {
  29. printf("%d %d\n", i + , rec[p].pos);
  30. return;
  31. }
  32. p++;
  33. }
  34. }
  35. }
  36. puts("No");
  37. }
  38. int main() {
  39. #ifdef LOCAL
  40. freopen("in.txt", "r", stdin);
  41. freopen("out.txt", "w+", stdout);
  42. #endif
  43. int n, k;
  44. while (~scanf("%d", &n)) {
  45. for (int i = ; i <= n; i++) {
  46. scanf("%d", &arr[i]);
  47. sum[i] = sum[i - ] + arr[i];
  48. rec[i].v = sum[i], rec[i].pos = i;
  49. }
  50. scanf("%d", &k);
  51. sort(rec + , rec + n);
  52. for (int i = ; i <= n; i++) temp[i] = rec[i].v;
  53. solve(n, k);
  54. }
  55. return ;
  56. }

九度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. dev中如何对combox下拉框设置可消除属性以及ASPxGridView中金额,数量的显示,以及总计、grid中某行值

    下拉框属性关键:IncrementalFilteringMode="StartsWith" DropDownStyle="DropDown" ASPxGridV ...

  2. NSBundle 的使用

    NSBundle 读取图片 plist text NSBundle *mainbundle=[NSBundle mainBundle]; //使mainBundle 对象获取图片的路径 NSStrin ...

  3. 把jqmobi 變成jQuery 的插件 從此使用jQuery

    因為項目的要求,需要用到jQuery 的一些插件 ,而我又是用jqmobi的....o(╯□╰)o 看看文檔.....把jqmobi  變成jQuery的插件  問題就解決了 O(∩_∩)O哈哈~ 官 ...

  4. ionic cordova plugin simple demo

    要用cordova plugin 的话还是需要设置一下的 1. 下载 ng-cordova.js download the zip file here 2. 在index.html 中引用 (cord ...

  5. HTML5-新API-geolocation-实例-距离跟踪器

    <body onLoad="loadDemo()"> <header> <h1>oldmeter演示</h1> <h4> ...

  6. chkdsk 和sfc.exe修复命令

    1:chkdsk:chkdsk的全称是checkdisk,就是磁盘检查. CMD->help chkdsk CHKDSK [volume[[path]filename]]] [/F] [/V] ...

  7. 模拟cpu调度

    先来先服务实现简单但是平均周转时间过长 短作业优先算法缩短了平均周转时间 #!/usr/bin/python #-*- coding: utf-8 -*- # # table # 0:进程号 1:到达 ...

  8. 软件工程 speedsnail 冲刺7

    2015-5-11 完成任务:蜗牛移动的一部分: 遇到问题: 问题1 速度,坐标,角度: 速度分级别设置: 坐标记录功能,方便障碍物检测: 暂定初始45度角: 解决1 未解决上述问题 明日任务: 蜗牛 ...

  9. 转载:T-SQL语句大全

    一.基础 1.创建数据库 CREATE DATABASE database-name 2.删除数据库 drop database dbname 3.备份数据库 --- 创建 备份数据的 device ...

  10. Silverlight 使用IsolatedStorage新建XML文件,并且用LINQ查询XML

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...