2 条题解

  • 1
    @ 2024-10-26 20:03:19

    题意

    有n个人编号从 1 1 n n 。给你一个数组 a a aia_i 代表第 i i 个人的实力为 aia_i,实力较强的人可以在比赛中胜出。现在让这些人按顺序从 编号 11nn 依次进行比赛,上一次比赛中胜出的人继续和下一个人比赛。现在假设你是第 k k 个人,你可以选择一个人交换你们两个比赛的顺序(也可以不选),你想让你获胜的场次尽可能的多,问你交换完成后你获胜的场次最多是多少。

    思路

    此题在本场比赛中较难

    其实就是要每场比赛都要下一个人与上一场的获胜者进行比赛,如果第 kk 个人前面有比他大的,则当前方案胜场为 00 。所以我们要让第k个人尽量靠前或将比k大的第一个人向后移,即求出第k个人和第一个人交换第k个人和第一个比它大的人交换的方案取最大即可。

    尤其注意代码中的细节处理!!!

    代码

    C语言

    #include<stdio.h>
    int a[100005],a1[100005];
    
    int max(int a,int b)
    {
    	if(a>b)return a;
    	else return b;
    }
    
    void solve()
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a1[i]=a[i];
        }
    
        int s=a[k],r=n;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>s)
            {
                r=i;
                break;
            }
        }
    
        int ans1=0;
        int tt=a[k];
        a[k]=a[1];
        a[1]=tt;
        for(int i=2;i<=n;i++)
        {
            if(a[i]<=s)ans1++;
            else break;
        }
        
        int ans2=0;
        int tt1=a1[k];
    	a1[k]=a1[r];
    	a1[r]=tt1;
        if(r<k)
        {
            for(int i=r+1;i<=n;i++)
            {
                if(a1[i]<=s)ans2++;
                else break;
            }
            if(r!=1)ans2++;
        }
        
        
        int ans=max(ans1,ans2);
        printf("%d\n",ans);
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            solve();
        }
        return 0;
    }
    

    C++

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int a[100005],a1[100005];
    
    void solve()
    {
        int n,k;
        cin >> n >> k;
        for(int i=1;i<=n;i++)
        {
            cin >> a[i];
            a1[i]=a[i];
        }
    
        int s=a[k],r=n;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>s)
            {
                r=i;
                break;
            }
        }
    
        int ans1=0;
        swap(a[1],a[k]);//c++中的交换函数,交换a[1]和a[k]的值。
        for(int i=2;i<=n;i++)
        {
            if(a[i]<=s)ans1++;
            else break;
        }
        
        int ans2=0;
        swap(a1[r],a1[k]);
        if(r<k)
        {
            for(int i=r+1;i<=n;i++)
            {
                if(a1[i]<=s)
                {
                    ans2++;
                }
                else break;
            }
            if(r!=1)ans2++;
        }
        
        int ans=max(ans1,ans2);
        cout << ans <<endl;
    }
    
    int main()
    {
        int t;
        cin >> t;
        while(t--)
        {
            solve();
        }
        return 0;
    }
    

    信息

    ID
    1032
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    59
    已通过
    10
    上传者