题目:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1094
暴力的O(n*n)也能过,惊讶!
写一发map优化的O(n)算法:算出前缀和,并用map维护,然后判断k+sum[i](即前缀和)是否存在,最后判断这个区间是否存在(有可能在前面,因此要判断)。
数组定义了ll,输入数组的忘格式了,WA了一发。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a[10005],sum[10005]; map<ll,ll>mp; main() { int n,k,i,j; scanf("%d%d",&n,&k); memset(sum,0,sizeof(sum)); for(i=1;i<=n;i++) { scanf("%lld",&a[i]); sum[i]=sum[i-1]+a[i]; mp[sum[i]]++; } for(i=0;i<=n;i++) { if(mp[sum[i]+k]) { for(j=i+1;j<=n;j++) { if(sum[j]-sum[i]==k) { printf("%d %d\n",i+1,j); return 0; } } } } printf("No Solution\n"); return 0; }