1065 最小正子段和
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注
N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子序列(a[i],a[i+1],…a[j]),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的。
例如:4,-1,5,-2,-1,2,6,-2。-1,5,-2,-1,序列和为1,是最小的。
Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数
Output
输出最小正子段和。
Input示例
8
4
-1
5
-2
-1
2
6
-2
Output示例
1
第一次 因为 没有用longlong 导致后面几组全炸了
#include<bits/stdc++.h>
using namespace std;
struct ac{
long long x,y;
}a[500001];
bool cmp(struct ac q,struct ac w){
if(q.x==w.x) return q.y<w.y;
return q.x<w.x;
}
int main(){
int n;
cin>>n;
long long mi=0;long long mx=9999999;
a[0].x=0; a[0].y=0;
for(int j=1;j<=n;j++){
a[j].x=0;
long long s;
cin>>s;
a[j].x=s+a[j-1].x;
a[j].y=j;
if(a[j].x>0)
mx=min(mx,a[j].x);
}
sort(a+1,a+n+1,cmp);
mi=a[1].x;
if(mi<0) mi=99999999;
//cout<<mi<<endl;
for(int j=2;j<=n;j++){
if(a[j].y>a[j-1].y){
long long s=a[j].x-a[j-1].x;
if(s>0&&mi>0){
mi=min(mi,s);
}
//cout<<mi<<" "<<s<<endl;
}
}
mi=min(mx,mi);
cout<<mi<<endl;
return 0;
}
```t
贴一个 用 stl 写的 要学会 stl 啊
<div class="se-preview-section-delimiter"></div>
这里写代码片
“`
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
pair<ll,int>sum[55555];
int a[55555];
int main()
{
int n,i,j;
ll ans;
cin>>n;
ans=99999999;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<=n;i++) {
sum[i].first=sum[i-1].first+a[i];
sum[i].second=i;
}
sort(sum+1,sum+1+n);
if(sum[1].first>0)ans=sum[1].first;
for(i=2;i<=n;i++) {
if(sum[i].first>0) ans=min(ans,sum[i].first);
if(sum[i].second>sum[i-1].second && sum[i].first!=sum[i-1].first) ans=min(ans,sum[i].first-sum[i-1].first);
cout<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}