码迷,mamicode.com
首页 > 其他好文 > 详细

[51nod1094]和为k的连续区间

时间:2017-05-29 19:16:30      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:复杂度   blog   clu   暴力   std   div   return   namespace   区间   

法一:暴力$O({n^2})$看脸过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int a[50002],sum[50002];
 5 int main(){
 6     int n,k;
 7     cin>>n>>k;
 8     for(int i=1;i<=n;i++){ cin>>a[i];sum[i]=sum[i-1]+a[i];} 
 9     bool flag=false;
10     for(int i=0;i<n;i++){
11         for(int j=i+1;j<=n;j++){
12             if(sum[j]-sum[i]==k){
13                 cout<<i+1<<" "<<j<<endl;
14                 flag=true;
15                 break;
16             }
17         }
18         if(flag) break;
19     }
20     if(!flag) cout<<"No Solution\n";
21     return 0;
22 }

法二:map优化,存储sum数组的下标,复杂度$O(n\log n)$

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll a[50002],s[50002];
 5 int main(){
 6     map<ll,int>m;
 7     ll n,k;
 8     cin>>n>>k;
 9     for(ll i=1;i<=n;i++){ cin>>a[i];s[i]=s[i-1]+a[i];}
10     for(ll i=n;i>=1;i--) m[s[i]]=i;
11     bool ok=false;
12     ll l,r;
13     m[0]=0;
14     for(ll i=1;i<=n;i++){
15         
16         if(s[i]-k==0&&!ok) l=1,r=i,ok=true; 
17         
18         else if(m[s[i]-k]){
19             if(m[s[i]-k]+1>i) continue;
20             if(!ok) l=m[s[i]-k]+1,r=i,ok=true;
21             else{
22                 if(m[s[i]-k]+1<l) l=m[s[i]-k]+1,r=i;
23                 else if(m[s[i]-k]+1==l) r=min(r,i);
24             }
25         }
26     }
27     if(!ok) cout<<"No Solution\n";
28     else cout<<l<<" "<<r<<endl;
29 
30     return 0;
31 }

法三:据说二分可以做?

 

[51nod1094]和为k的连续区间

标签:复杂度   blog   clu   暴力   std   div   return   namespace   区间   

原文地址:http://www.cnblogs.com/elpsycongroo/p/6918721.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!