2 条题解

  • 0
    @ 2025-10-18 14:40:24
    #include<bits/stdc++.h> 
    using namespace std;
    long long n,k,ans,a[110000],b[110000],f[110000];
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
    	sort(b+1,b+n+1);
    	for(int i=1;i<=n;i++)
    	{
    		if(a[i]!=b[i])
    		{
    			for(int j=i+1;j<=n;j++)
    			{
    				if(a[j]==b[i]&&a[i]==b[j])
    				{
    					swap(a[i],a[j]);
    					ans++;
    					break;
    				}
    				
    			}
    			if(a[i]!=b[i])	
    			{
    				f[a[i]]++;	
    			}
    		}
    		
    	}
    	int t=min(f[1],min(f[2],f[3]));
    		ans=ans+t*2;
    		for(int i=1;i<=3;i++) f[i]-=t,k=k+f[i];
    		ans=ans+k/2;
    	cout<<ans;
    }
    
    • 0
      @ 2025-7-2 19:43:34

      贪心解决

      #include <bits/stdc++.h>
      using namespace std;
      int n,a[1001],t[4],c[4][4],ans;
      int main()
      {
          cin>>n;
          for (int i=1;i<=n;i++) cin>>a[i],t[a[i]]++;
          for (int i=1;i<=t[1];i++) c[1][a[i]]++;
          for (int i=t[1]+1;i<=t[1]+t[2];i++) c[2][a[i]]++;
          //统计个数
          ans=c[1][2]+c[1][3];//把1换到正确位置的最少步数
          c[2][3]+=max(0,c[2][1]-c[1][2]);//有多少3被交换到了二位置
          ans+=c[2][3];//将2,3交换到正确位置
          cout<<ans;
          return 0;
      }
      
      • 1

      信息

      ID
      450
      时间
      1000ms
      内存
      256MiB
      难度
      4
      标签
      (无)
      递交数
      58
      已通过
      28
      上传者