2 条题解

  • 1
    @ 2024-10-27 0:39:38

    想到要放在前面,也想到,和他之前的第一个大于他的数交换位置,但是我多想了想着交换情况是不是和那个数后面的大小也有关,也没有同时计数的思想,就想着直接输出结果,直接通向正确答案。受教了。

    #include<stdio.h> int main(){ int n; scanf("%d",&n); while(n--) { int a,b; scanf("%d%d",&a,&b); int arr[a+9]={0}; for(int i=1;i<=a;i++) { scanf("%d",&arr[i]); } int y=1; for(int i=1;i<b;i++) { if(arr[i]>arr[b]) { y=i; break; } } int q1=0,q2=0; int w=arr[b]; arr[b]=arr[1]; arr[1]=w; int max=-111; for(int i=1;i<=a;i++) { if(arr[i]>max) { max=arr[i]; } if(arr[1]==max) { q1++; } } q1--; arr[1]=arr[b]; arr[b]=w; int e=arr[b]; arr[b]=arr[y]; arr[y]=e; max=-1111; for(int i=1;i<=a;i++) { if(arr[i]>max) { max=arr[i]; } if(arr[y]max) { q2++; } } if(y1) { q2--; } if(q1>q2) { printf("%d\n",q1); } else { printf("%d\n",q2); }

    } return 0; }

    • 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;
      }
      
      • 1

      信息

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