1 条题解
-
0
C :
#include<stdio.h> #include<math.h> int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); long long a[n+1],one=0,res=0;//one存储当前1的数目,res存不操作后的结果 long long first_0=-1,last_1=-1;//如变量名,存第一个0和最后一个1的位置 for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=n;i>0;i--) if(a[i]==1) { res+=n-i-one;//累加上该1贡献的逆序数 one++;//1的数目自增 if(last_1==-1)//仅在1第一次出现时执行 last_1=i;//确保存的是最后一个1 } else first_0=i;//持续更新first_0位置,确保存的是第一个0 long long _0to1=res-(first_0-1)+(n-one-1); long long _1to0=res-(n-last_1)+(one-1); res=fmax(fmax(_1to0,_0to1),res);//调用math库中的fmax函数取出三种情况最大值 if(first_0==-1||last_1==-1)//如果全是1或全是0 printf("%lld\n",n-1); else printf("%lld\n",res); } return 0; }C++ :
#include<bits/stdc++.h> #define F first #define S second #define pb push_back using namespace std; int gcd(int a, int b){return b ? gcd(b, a % b) : a;}//最大公因数 int lcm(int a, int b){return a * b / __gcd(a, b);} //最小公倍数 typedef long long LL,ll; typedef pair<int,int> pii; typedef pair<LL,LL> pll; void solve() { int n; cin>>n; ll a[n]; for(int i=0;i<n;i++) cin>>a[i]; ll k=0,sum=0,l1=-1,f0=-1; for(int i=n-1;i>=0;i--) if(a[i]){ a[i]=k; sum+=k; if(l1==-1) l1=i; } else { a[i]=++k; f0=i; } if(l1==-1||f0==-1) cout<<n-1<<'\n'; else cout<<max({sum,sum+n-k-1-a[l1],sum+k-1-f0})<<'\n'; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) solve(); return 0; }
- 1
信息
- ID
- 741
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 提交数
- 0
- 已通过
- 0
- 上传者