第二此测试补题1月31日

1.

此题目很简单只要建立一个26字母数组来统计每个字母出现的次数。代码如下。

#include<stdio.h>
#include<string.h>
int max;
char a[1001];
int b[26];
int main()
{
    scanf("%s",a);
    int len=strlen(a);
    for(int j=0;j<len;j++)
    {
        b[a[j]-'a']++;
    }
    for(int i=0;i<26;i++)
    {
        if(b[i]>b[max])
        max=i;
    }
    printf("%c",max+'a');
    return 0;
}

2.

此题目就是枚举。先把a能最多耗费多少食物算出来,然后因为不知道a食物需要几份。所以需要枚举每一项的b所做出来几份。最后总份数计算每此枚举的最大值。

#include<stdio.h>
int main()
{
    int t,a[11],b[11],c[11],d[11],y;
    scanf("%d",&t);
    int min=9999999,sum=0,min2=9999999;
    for(int i=0;i<t;i++)
    {
        scanf("%d",&a[i]);
    }
      for(int i=0;i<t;i++)
    {
        scanf("%d",&b[i]);
    }
      for(int i=0;i<t;i++)
    {
        scanf("%d",&c[i]);
    }
    for(int i=0;i<t;i++)
    {
        if(b[i]!=0)
        {
            if(min>a[i]/b[i])
            min = a[i]/b[i];
        }
    }
    for(int j=0;j<=min;j++)
    {
        for(int i=0;i<t;i++)
        {
            y=a[i]-j*b[i];
            if(c[i]==0)
            continue;
           if(min2>y/c[i])
           min2=y/c[i];
        }
        if(sum<j+min2)
        sum=j+min2;
    }
    printf("%d",sum);
    return 0;
}

3.

此题目只要理解了题意就很简单。意思是n表示从1~k个字符抽取n个字符组合字符串h,要使从s串中间删除某些元素使得s串能变成所有的h串的组合,然后让我们找到长度最短的s串。其实就是重复输出k个小写字母这里直接就是从a开时就行。

#include <stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<k;j++)
            {
                printf("%c",'a'+j);
            }
        }
        printf("\n");
    }
    return 0;
}

4.

此题因为一个数的约数可以是几个数的约数而且这几个数之和等于这个数,只要知道每个约数然后枚举出来就行。

#include<stdio.h>
int main()
{
    int t,x,n,max=0;
    scanf("%d",&t);
    while(t--)
    {
        max=0;
        scanf("%d %d",&x,&n);
        for(int i=1;i*i<=x;i++)
        {
            if(x%i==0)
            {
                int b=x/i;
                if(b>=n)
                {
                    if(max<i)
                    max=i;
                }
                if(i>=n)
                {
                    if(max<b)
                    max=b;
                }
            }
        }
        printf("%d\n",max);

    }
    return 0;
}

5.

这个题很简单因为不断靠近的终点值假设这个终点值在右上角也就是都为正数肯定是先上再右或者先右再上。其实就只要算能向上多少与能向右多少。两个值相减去就是要停下来的次数。注意当为0时就不需要停。

#include<stdio.h>
#include<math.h>
int main()
{
    int t,a,b;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d",&a,&b);
        int c=abs(abs(a)-abs(b));
        int z;
        if(c==0)
        z=c;
        else
        z=c-1;
        printf("%d\n",abs(a)+abs(b)+z);
    }
    return 0;
}

6.

此题目为搜索题但有点不一样,我这里是dfs的方法。首先我要设置三个参数两个表示位置一个表示方向。设两个二维数组, searched 数组用于标记是否曾以某方格为起点进行搜。而 reachable 数组用于标记某方格是否可到达。中间记得舍去反方向搜索的防止重复搜索。代码如下。

#include <stdio.h>
#define MAX_R 210
#define MAX_C 210
 int dr[5] = { 0, -1, 0, 0, 1 };
int dc[5] = { 0, 0, -1, 1, 0 };
int n,m;
char sq[MAX_R][MAX_C];
int searched[MAX_R][MAX_C];
int reachable[MAX_R][MAX_C];
void dfs( int r,  int c, int z);
int main() {
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; ++i) 
    {
        scanf("%s", sq[i] + 1);
    }
    dfs(2, 2, 0);

    int cnt = 0;
    for (int i = 1; i <= n; ++i) 
    {
        for (int j = 1; j <= m; ++j) 
        {
            cnt += reachable[i][j];
        }
    }

    printf("%d\n", cnt);

    return 0;
}

void dfs( int r,  int c,  int z) {
    if (searched[r][c]) {
        return;
    }
    searched[r][c] = 1;
    reachable[r][c] = 1;
    for (int i= 1; i <= 4; ++i) 
    {
        if (i + z == 5) 
        {
            continue;
        }
        int x = r, y= c;
        while (sq[x + dr[i]][y + dc[i]] == '.') 
        {
            x += dr[i];
            y += dc[i];
            reachable[x][y] = 1;
        }
        dfs(x, y, i);
    }
}

今天学的很杂,导致我最后写补题的时候头脑有点转不过来所以今天很慢。希望明天的状态更好。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值