1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int a[100010],p[100010],s[100010],stmp[100010]; inline bool cmp(int x,int y){ return s[x]<s[y]; } inline void halt(){ puts("-1"); exit(0); } int main(){ int n,mx=0; cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); p[i]=i;s[i]=s[i-1]+a[i],stmp[i]=s[i]; mx=stmp[n]; } sort(stmp+1,stmp+1+n); if(stmp[1]<=0 || stmp[n]!=mx) halt(); for(int i=1;i<n;i++) if(stmp[i]==stmp[i+1]) halt(); sort(p+1,p+1+n,cmp);//该排在第i的数的位置为p[i] for(int i=1;i<=n;i++) s[p[i]]=i;//成功离散化 int ans=n;//不能是n-1哦 for(int i=1;i<=n;i++){ if(s[i]==i) ans--; else{ swap(p[s[i]],p[i]),swap(s[p[s[i]]],s[i]); }//这里的两个swap自己找一组数去模拟着理解,其实实现的就是上面那个贪心 } cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 661
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 11
- 已通过
- 3
- 上传者