1094 和為k的連續區間
基準時間限制:1 秒 空間限制:131072 kb 分值: 10 難度:2級演算法題 收藏 關注
一整數數列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本來要睡,想著看乙個題,思考一下,免得自己閒下來。發現這個題,感覺恰巧可以用剛剛寫過的那個方法,簡單的dp,然後利用兩個for迴圈列舉一下。最後輸出,這樣的思路**如下:
比較容易想到,但,寫到這裡,我突然想到之前做的乙個題,也是51nod上的乙個題,求陣列中等於k的陣列,那個題是利用兩個指標,從兩邊遍歷,我印象也比較深。這個題可不可以也利用這個再一次的優化呢。我試一下。好吧,我試了一下,不行,那個的基礎是需要排序,這個一旦排序,順序亂了,無法確定區間端點。我搜了下其他人的**。有利用map什麼的,我目前還看不懂,今天已經看不下去了,睡覺,明天再看。/好吧,其實沒什麼的,整個map我還沒看,不知道,單就這個題而言,無非是先判斷這個數字是否存在,然後再找區間端點。我還以為有多難,都是紙老虎。不過複雜度從o(n*n)降到了o(n)。蠻不錯。。/#include"cstdio"
#include"algorithm"
#include"cstring"
#include"cmath"
using namespace std;
int main ()
int flag=0;
int minn=0;
for(i=1;i<=n;i++)
}if((sum[j-1]-sum[i-1])==k)
break;
}if(flag==0)
printf("no solution\n");
return
0;}
自取。#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const
int maxn = 1e4+5;
ll a[maxn], sum[maxn];
mapmp;
int main()
for(i=0; i<=n; i++)
if(mp[sum[i]+k])
for(j=i; j<=n; j++)
if(sum[j]-sum[i] == k)
puts("no solution");
endw:;
}return
0;}
51nod 1094 和為k的連續區間
一整數數列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 如果沒有...
51nod 1094 和為k的連續區間
一整數數列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 如果沒有...
和為k的連續區間 51Nod 1094
一整數數列a1,a2,an 有正有負 以及另乙個整數k,求乙個區間 i,j i,j 1 i j n 使得a i i a j j k。input 第1行 2個數n,k。n為數列的長度。k為需要求的和。2 n 10000,10 9 k 10 9 第2 n 1行 a i i 10 9 a i i 10 9...