法一:暴力$o()$看臉過
1 #include2using
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 #include2using
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 #include2using
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 如果沒有...