1. 程式人生 > >51nod 1094 和為k的連續區間【前綴和/區間差/map】

51nod 1094 和為k的連續區間【前綴和/區間差/map】

分別是 F12 nod question 空間限制 多個 for 數列 bsp

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

【代碼】:
技術分享
#include <bits/stdc++.h>

using namespace std;
#define inf 1e18+100
#define LL long long

const int maxn = 1e4+100;

int main()
{
    int n,k;
    
int a[maxn],sum[maxn]; memset(sum,0,sizeof(sum)); cin>>n>>k; for(int i=1;i<=n;i++) { cin>>a[i]; sum[i]=sum[i-1]+a[i]; } for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { if(sum[j]-sum[i]==k) { printf(
"%d %d\n",i+1,j); return 0; } } } printf("No Solution\n"); return 0; }
前綴和+暴力O(n²)

map優化可達到O(n)

51nod 1094 和為k的連續區間【前綴和/區間差/map】