您的位置:首页 > 其它

51nod 1065 最小正子段和 -暴力

2017-12-09 20:48 281 查看
这道题我的解法算得上是卡过去的,每组数据的答案再稍微大点就过不了了

因为答案是一个大于等于1的整数,直接暴力搜索是否存在Sj-Si=u。其中Sn代表前n个元素的和,u是枚举数从小到大枚举,也就是查询是否存在Si=Sj-u,存在的话此时的u就是答案。需要注意的是 i 必须小于 j。

因为有两个条件,直接借助map来判断,最终时间复杂度为mnlogn,这里m就是答案的值。

提交时因为第17组数据的答案有点大而超时了但超的不多,我坚信自己的代码是能通过的,多次提交后成功通过了

代码:

#include<iostream>
#include<map>
using namespace std;

long long sum[50050];
map<long long,int> all;

int main(){
long long u,n,s=0;
cin>>n;
all[0]=-1;
for(int i=0;i<n;i++){
cin>>u;s+=u;
sum[i]=s;
all[s]=i;
}

int ans=0;
while(++ans){
for(int i=0;i<n;i++){
map<long long,int>::iterator v=all.find(sum[i]-ans);
if(v!=all.end()&&v->second<i){
cout<<ans;
return 0;
}
}
}
}

截图为证:



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: