思维性题集二(第二次考试)

文章讲述了四道编程竞赛题目,涉及字符串频率统计、背包问题优化、字符串生成和整数除法简化,强调了解决问题时的思维方式和简化算法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:Frequency

一如既往,第一题都是水题一个

题解:用s数组输入字符串,a数组统计每个单词出现的频率,遍历s数组中的每一个一个单词,出现了就在a数组里+1,后面遍历a数组,用max变量统计出现最多的单词,最后,输出统计最多的单词就可以;

AC代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char s[1005];//输入字符串
    int a[30]={0};//统计每个单词的频率
    scanf("%s",s);
    int len=strlen(s);//求出字符串长
    for(int i=0;i<len;i++)
    {
        a[s[i]-'a'+1]++;//统计出现次数
    }
    int max=0;
    for(int i=1;i<=26;i++)
    {
        if(a[i]>a[max])
        {
            max=i;
        }
    }
    printf("%c",'a'+max-1);
    return 0;
}

 

第二题:Leftover Recipes

这题我只能说有好方法,我想复杂了,原本打算用动态规划01背包那种思想去写的,想的是取a或者取b,但是后面发现两重循环就秒了,结果还卡了时间,说多了都是泪,呜呜

题解:首先先求出最大能做几份a菜肴,然后循环a菜肴的个数,去求最大的b菜肴,然后求出总和sum,如果比之前出现的最大值max大,就更新max的值

#include <bits/stdc++.h>
using namespace std;
int n;
int p[50];
int a[50];
int b[50];
int s1=0x3f3f3f3f,s2;
int sum=0;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&p[i]);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]!=0&&p[i]/a[i]<s1)
        {
            s1=p[i]/a[i];//去求出最大的a菜肴个数
        }
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
    }
    for(int i=0;i<=s1;i++)
    {
        s2=0x3f3f3f3f;
        for(int j=0;j<n;j++)
        {
            if(b[j]!=0&&(p[j]-a[j]*i)/b[j]<s2&&b[j]!=0)
            {
                s2=(p[j]-a[j]*i)/b[j];
            }
        }
        sum=max(s2+i,sum);//更新sum的值
    }
    printf("%d",sum);
    return 0;
}

第三题:We Got Everything Covered!

这题也不算很难,用了10分钟就写出来了,主要是去思考 怎样才会有符合的字符串;

题解:不知道该怎么去描述了,就直接说结论吧,前面那个n决定了循环的次数,后面那个k决定了有多少个字母,真的是纯思维题目,没有什么需要多说的,直接看代码好了(如果真的不懂直接私信即可)

AC代码

#include <stdio.h>
#include <stdlib.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;
}

第四题:A Balanced Problemset?

题解:

AC代码:分享一位天才的代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int x,n;
        scanf("%d%d",&x,&n);
        while(x%n!=0)
        {
            n=(x-1)/(x/n)+1;
        }
        printf("%d\n",x/n);
    }
    return 0;
}

 第五题:Lame King

 

题解:乍一看像是要用bfs求最短路径,但是后面才发现,用bfs写的话太过于麻烦了,而是要用思维的方式去解决这个问题,就是要横着走一下,竖着走一下,直到和目标点到了,同一行或者列,然后再用移动,跳过的方式一直摸到目标点

AC代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long t,a,b,x,y;
    scanf("%lld",&t);
    while(t--)
    {
        int sum=0;
        scanf("%lld%lld",&a,&b);
        x=abs(a),y=abs(b);
        \
        if(x==y)
            sum=x*2;
        else
            sum=max(x,y)*2-1;
        printf("%lld\n",sum);
    }
    return 0;
}

总结,这次考试其实还都是思维的题目,但是不如上回发挥的好,主要还是自己想的太复杂了,其实可以思考的简单一点的,下次要注意

寄语:

据说每个人的生命里
都会遇见一束光
在此前天地迷离 长夜永驻
窒息的空气里 没有悲欢的温度
长风不起 黄沙漫天
黯淡的星空里 是重复的余年
有一天有一束光闯了进来
那样迷人 那样刺眼
仅一个照面
脑子就忍不住幻想接下来的故事 
一眼万年
此后云海开始翻涌
江潮开始澎湃
昆虫的小须挠着全世界的痒
天地万物 便通通动了起来

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值