• 9/15 越努力越幸运-思维赛(2.0)解题思路


    A

    题意:给一组数据和一个k,求比k小的数的个数,比较只能从最左边或者最右边开始,当数据比k大时结束

    解题思路:找出数据中的最大值,如果最大值比k小,输出数据的个数,否则从前和后判断两次,输出两次比k小的个数之和

    代码:

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    int main()
    {
       int n,k,i,a[100],ans=0,flag=0,max,b=0;
       while(~scanf("%d%d",&n,&k))
       {
           for(i=0;i<n;i++)
            scanf("%d",&a[i]);
            max=a[0];
            for(i=0;i<n;i++)
            {
                if(a[i]>max)
                    max=a[i];
            }
            if(k>=max)
            {
                for(i=0;i<n;i++)
                {
                    if(a[i]<=k)
                        b++;
                }
                printf("%d ",b);
            }
            else
            {
                   for(i=0;i<=n;i++)
                   {
                       if(a[i]<=k)
                        ans++;
                        else
                            break;
                   }
                   for(i=n-1;i>=1;i--)
                   {
                       if(a[i]<=k)
                        flag++;
                        else
                            break;
                   }
                   printf("%d ",flag+ans);
            }
       }
    return 0;
    }

    B

    题意:给一组数代表的是爬山的步数,求爬山的步骤和每一个步骤的步数

    解题思路:判断1的个数为爬山步骤,当a[i]>a[i+1]时记录a[i]到一个新的数组,输出新的数组和数组a的最后一个值

    代码:

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    int main()
    {
      int n,i,a[1000],ans=0,b[1000],tot=0;
      while(~scanf("%d",&n))
      {
          for(i=0;i<n;i++)
          {
            scanf("%d",&a[i]);
          if(a[i]==1)
            ans++;
          }
          printf("%d ",ans);
         for(i=0;i<n-1;i++)
         {
             if(a[i]>=a[i+1])
             {
                 b[tot]=a[i];
                 tot++;
             }
         }
         b[tot]=a[n-1];
         for(i=0;i<=tot;i++)
            printf("%d ",b[i]);
      }
    return 0;
    }

    C

    题意:给一组数和一个k,将这组数随机分为k份,找出每一份的最小值,然后找出这些最小值的最大值,使输出的最大值最大

    解题思路:当k等于1时直接输出最小值,当k大于等于3时直接输出最大值,当k==2时比较第一个值和最后一个值的大小,输出最大值

    代码:

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
      int a[1000010];
    int main()
    {
      int n,k,i,min,max;
      while(~scanf("%d%d",&n,&k)) { for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
            min=a[1];
            max=a[1];
          for(i=1;i<=n;i++)
          {
              if(a[i]<min)
                  min=a[i];
                  else
                  if(a[i]>max)
                    max=a[i];
          }
          if(k==1)
            printf("%d ",min);
          else if(k>=3)
            printf("%d ",max);
            else
                if(k==2)
            {
            if(a[1]>a[n])
                printf("%d ",a[1]);
            else
                printf("%d ",a[n]);
            }
      }
    return 0;
    }

    D

    题意:解密字符串,加密规则为每次翻转字符1-n,n为字符串长度的因子

    解题思路:翻转字符串,翻转顺序1-n,n为因子

    代码:

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    int main()
    {
      int n,i,j,x,flag=0;
      char a1[110],a2[110],b[100];
      while(~scanf("%d%s",&n,a1))
      {
        for(i=2;i<=n;i++)
        {
            if(n%i==0)
            {
                b[flag++]=i;
            }
        }
        for(i=0;i<flag;i++)
        {
            for(j=0;j<b[i];j++)
            {
              a2[b[i]-j-1]=a1[j];
            }
            for(j=0;j<b[i];j++)
                a1[j]=a2[j];
        }
        printf("%s ",a1);
      }
    return 0;
    }

    E

    题意:给两串字符串,从左到右依次删除字符使两串字符相等,求删除的字符个数之和

    解题思路:从后面比较两串字符是否相等,如果相等记下相等字符的个数,输出两串字符的长度之和减去相等字符个数的二倍

    代码:

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    int main()
    {
      int i,j,x,y,flag=0;
      char a[200010],b[200010];
      gets(a);
      gets(b);
      x=strlen(a);
      y=strlen(b);
      if(a[x-1]!=b[y-1])
        printf("%d ",x+y);
      else
      {
        for(i=x-1,j=y-1;i>=0,j>=0;i--,j--)
        {
            if(a[i]==b[j])
                flag++;
            else
                break;
        }
        printf("%d ",x+y-2*flag);
      }
    return 0;
    }

    F

    题意:给一个字符串和一个数k,k是从字符串中删掉的字符个数,删除顺序为a到z,将每一个字符都删除完后再从下一个字符开始删

    解题思路:扫描整串字符,找寻a[i]=='a'==ch时k--,ch++,当k==0时结束,输出剩余的字符串

    代码:

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    int main()
    {
      int n,k,i,min;
      char a[400050],ch='a';
      while(~scanf("%d%d%*c",&n,&k))
      {
          gets(a);
        while(k)
        {
            for(i=0;i<n;i++)
            {
                if(a[i]==ch)
                {
                    k--;
                    a[i]='0';
                    if(k==0)
                        break;
                }
            }
            ch++;
        }
        for(i=0;i<n;i++)
        {
            if(a[i]!='0')
                printf("%c",a[i]);
        }
      }
    return 0;
    }

  • 相关阅读:
    uIP的ARP协议分析
    如何使函数不生成执行代码
    计算机网络基础
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
    [Hive
  • 原文地址:https://www.cnblogs.com/xiao20000605/p/11622615.html
Copyright © 2020-2023  润新知