1 条题解

  • 0
    @ 2024-12-26 17:11:44

    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
    上传者