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

原文地址:https://www.cnblogs.com/xiao20000605/p/11622615.html