51nod1094 和為k的連續區間

2022-05-01 23:21:21 字數 1394 閱讀 7952

法一:暴力$o()$看臉過

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

int a[50002],sum[50002];5

intmain()

9bool flag=false;10

for(int i=0;i)17}

18if(flag) break;19

}20if(!flag) cout<<"

no solution\n";

21return0;

22 }

法二:map優化,儲存sum陣列的下標,複雜度$o(n\log n)$

1 #include2

using

namespace

std;

3 typedef long

long

ll;4 ll a[50002],s[50002];5

intmain()

10for(ll i=n;i>=1;i--) m[s[i]]=i;

11bool ok=false;12

ll l,r;

13 m[0]=0;14

for(ll i=1;i<=n;i++)25}

26}27if(!ok) cout<<"

no solution\n";

28else cout<"

"2930

return0;

31 }

法三:二分複雜度$o(n\log n)$,特別注意二分時的判斷條件,很容易出錯,idx和sum不可以一起判斷,只能判斷完sum,再獨自判斷idx,否則答案會出錯

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

struct

nodea[10002

];7 ll b[10002];8

ll n,k;

9bool cmp(node &a,node &b)

12 ll erfen(int p,int

id)19

return

r;20

} 21

intmain()

29bool flag=false

;30 sort(a+1,a+n+1

,cmp);

31for(ll i=1;i<=n;i++)40}

41if(!flag) cout<<"

no solution\n";

42return0;

4344 }

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的連續區間

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為需要求...

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 如果沒有...