51Nod 1094 和為k的連續區間

2021-07-31 21:57:04 字數 1698 閱讀 1456

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迴圈列舉一下。最後輸出,這樣的思路**如下:

#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;}

比較容易想到,但,寫到這裡,我突然想到之前做的乙個題,也是51nod上的乙個題,求陣列中等於k的陣列,那個題是利用兩個指標,從兩邊遍歷,我印象也比較深。這個題可不可以也利用這個再一次的優化呢。我試一下。好吧,我試了一下,不行,那個的基礎是需要排序,這個一旦排序,順序亂了,無法確定區間端點。我搜了下其他人的**。有利用map什麼的,我目前還看不懂,今天已經看不下去了,睡覺,明天再看。/好吧,其實沒什麼的,整個map我還沒看,不知道,單就這個題而言,無非是先判斷這個數字是否存在,然後再找區間端點。我還以為有多難,都是紙老虎。不過複雜度從o(n*n)降到了o(n)。蠻不錯。。/

#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...