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\n",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\n",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\n",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\n",min);
else if(k>=3)
printf("%d\n",max);
else
if(k==2)
{
if(a[1]>a[n])
printf("%d\n",a[1]);
else
printf("%d\n",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\n",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\n",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\n",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;
}