51Nod 1094 和为k的连续区间 (前缀和暴力枚举/map优化)
2016-02-14 03:58
615 查看
题目链接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1094
一整数数列a1,
a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 <= i <= j <= n),使得a[i] + ... + a[j] = k。
Input
Output
Input示例
Output示例
分析:前缀和,在暴力枚举(O(n^2))
大神使用map数组优化O(n)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1094
一整数数列a1,
a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 <= i <= j <= n),使得a[i] + ... + a[j] = k。
Input
第1行:2个数N,K。N为数列的长度。K为需要求的和。(2 <= N <= 10000,-10^9 <= K <= 10^9) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)。
Output
如果没有这样的序列输出No Solution。 输出2个数i, j,分别是区间的起始和结束位置。如果存在多个,输出i最小的。如果i相等,输出j最小的。
Input示例
6 10 1 2 3 4 5 6
Output示例
1 4
分析:前缀和,在暴力枚举(O(n^2))
<span style="font-size:24px;">#include"stdlib.h" #include"stdio.h" #include"string.h" #include"algorithm" #include"iostream" #include"math.h" using namespace std; const int maxn=10004; long long sum[maxn];//前缀和 int main() { int n,k,num; scanf("%d%d",&n,&k); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { scanf("%d",&num); sum[i]+=sum[i-1]+num; } bool ok=false; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(sum[j]-sum[i-1]==k) { ok=true; printf("%d %d\n",i,j); break; } } if(ok) break; } if(!ok) printf("No Solution\n"); return 0; }</span>
大神使用map数组优化O(n)
<span style="font-size:24px;">#include<cstdio> #include<cstring> #include<iostream> #include<map> using namespace std; #define min(a,b) a<b?a:b #define max(a,b) a>b?a:b int num[10009]; __int64 sum[10009]; int main() { int i,n,k; scanf("%d%d",&n,&k); memset(sum,0,sizeof(sum)); map<__int64 , int> mp; mp.clear(); for(i=1;i<=n;i++) { scanf("%d",&num[i]); sum[i]=sum[i-1]+num[i]; mp[ sum[i] ]++; } mp[ sum[0] ]++; bool sign=true; for(i=0;i<=n;i++) { mp[ sum[i] ]--; if( mp[ sum[i]+k ] >0 ) {</span><span style="font-size:24px;"> //printf("mp:%d %I64d i:%d\n",mp[ sum[i]+k ] , sum[i]+k ,i);////-- sign=false; int j; int flag=0; for(j=i+1;j<=n;j++) { if(sum[j]-sum[i]==k) break; } printf("%d %d\n",i+1,j); break; } } if(sign) printf("No Solution\n"); return 0; }</span>
相关文章推荐
- 【CSS3】为边框应用图片 border-image
- 2D image convolution
- OpenCV Computer Vision with Python第二章笔记
- randomize a vector
- 开机自启动Powershell脚本
- 51Nod 1092 回文字符串(LCS跟dp)
- 加快R运行的简易方法-使用内置函数和安装openBLAS
- Unity插件_____DoTween(二)
- 【Java】深夜代码祭(1)
- PyQt+OpenCV 录制保存、播放视频
- 键盘记录器
- c++异常
- 关于VS编译兼容XP的那点事(转)
- Linux进程管理
- 【POJ 1260】Pearls
- iOS开发之网络数据解析--GDataXML解析框架的使用
- [Ionic] Build and Run an Ionic App from Scratch
- Powershell 音乐播放
- tkinter事件高级用法实例
- list