机试_1_暴力求解

news2024/11/28 21:42:22

一、枚举

判断是否可以使用枚举:分析数据量。
若时间限制在1000ms的情况下,大约可以进行10⁷的运算。

复杂度数据量
O(n!)10
O(2ⁿ)20
O(n³)200
O(n²)3000
O(nlogn)10⁶
O(n)10⁷
O(√10)10¹⁴
O(logn)>10²⁰

在这里插入图片描述


1 abc–清华大学

描述

设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。

输入描述:

题目没有任何输入。

输出描述:

请输出所有满足题目条件的a、b、c的值。 a、b、c之间用空格隔开。 每个输出占一行。

示例1

输入:


输出:


题解:

分析:
abc和bcc是两个三位数,由乘法分配律可知
abc = a*100 + b*10 + c
bcc = b*100 + c*10 + c = b*100 + 11*c
abc + bcc = a*100 + b*110 + c*12
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    for (int a = 0; a <= 9; ++a) {
        for (int b = 0; b <= 9; ++b) {
            for (int c = 0; c <= 9; ++c) {
                if (a*100 + b*110 + c*12 == 532) {
                    cout << a << " " << b << " " << c << endl;
                }
            }
        }
    }
    return 0;
}

2 反序数–清华大学

描述:

设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321)
求N的值

输入描述:

程序无任何输入数据。

输出描述:

输出题目要求的四位数,如果结果有多组,则每组结果之间以回车隔开。

示例1

输入:

输出:

题解:

#include <iostream>
#include <cstdio>

using namespace std;

/*
 * 反序数--清华大学
 */
int main() {
    int num = 0;
    int reverseNum = 0;
    for (int a = 0; a <= 9; ++a) {
        for (int b = 0; b <= 9; ++b) {
            for (int c = 0; c <= 9; ++c) {
                for (int d = 0; d <= 9; ++d) {
                    num = a * 1000 + b * 100 + c * 10 + d;
                    reverseNum = d * 1000 + c * 100 + b * 10 + a;
                    //0XXX不是四位数
                    if (a != 0 && d != 0) {
                        if (9 * num == reverseNum) {
                            cout << a << b << c << d << endl;
                        }
                    }
                }
            }
        }
    }

    return 0;
}
#include <iostream>
#include <cstdio>

using namespace std;

/**
 * 获取num的反序数
 * @param num 
 * @return 
 */
int getReverseNumber(int num) {
    int reverseNumber = 0;
    while (num != 0) {
        reverseNumber *= 10;
        reverseNumber += num % 10;
        num /= 10;
    }
    return reverseNumber;
}

/*
 * 反序数--清华大学
 */
int main() {
    /*
     * 1111*9=9999,所以i循环到1111即可
     */
    for (int i = 1000; i <= 1111; ++i) {
        if (9 * i == getReverseNumber(i)) {
            cout << i << endl;
        }
    }

    return 0;
}

3 对称平方数–清华大学

描述

打印所有不超过256,其平方具有对称性质的数。如2,11就是这样的数,因为22=4,1111=121。

输入描述:

无任何输入数据

输出描述:

输出具有题目要求的性质的数。如果输出数据不止一组,各组数据之间以回车隔开。

示例1

输入:

输出:

题解:

#include <iostream>
#include <cstdio>

using namespace std;

/**
 * 获取num的反序数
 * @param num
 * @return
 */
int getReverseNumber(int num) {
    int reverseNumber = 0;
    while (num != 0) {
        reverseNumber *= 10;
        reverseNumber += num % 10;
        num /= 10;
    }
    return reverseNumber;
}

/**
 * KY267 对称平方数--清华大学
 * @return
 */
int main() {
    /*
     * 判断某个数num,其完全平方数是否为对称数
     * 即 num*num = num*num的反序数
     */
    for (int num = 0; num <= 256; ++num) {
        if (num * num == getReverseNumber(num * num)) {
            cout << num << endl;
        }
    }

    return 0;
}

二、模拟

  1. 图形排版
  2. 日期问题
  3. 其他模拟

1 输出梯形–清华大学

描述:

输入一个高度h,输出一个高为h,上底边为h的梯形。

输入描述:

一个整数h(1<=h<=1000)。

输出描述:

h所对应的梯形。

样例

输入:

4

样例输出:

      ****    
    ******  
  ******** 
**********

题解:

此题只需要按几何的方法画出梯形,然后找到行和列之间的关系即可。

在这里插入图片描述

#include <iostream>
#include <cstdio>
using namespace std;

/**
 * 输出梯形--清华大学
 * @return
 */
int main() {
    //用户出入h
    int h;
    while (cin >> h) {
        //行
        int row = h;
        //列
        int col = h + 2 * (h - 1);

        /*
         * 解法1
         */
        for (int i = 0; i < row; ++i) {
            //打印空格
            for (int j = 0; j < col - h - 2 * i; ++j) {
                cout << " ";
            }

            //打印 *
            for (int k = 0; k < h + 2 * i; ++k) {
                cout << "*";
            }
            //打印换行
            cout << endl;
        }

        /*
         * 解法2
         */
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                if (j < col - h - 2 * i) {
                    cout << " ";
                } else {
                    cout << "*";
                }
            }
            cout << endl;
        }
    }
    return 0;
}

2 叠筐–杭州电子科技大学

描述:

现在给你两种颜色的箩筐,需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。

输入描述:

输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;

输出描述:

输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。

示例:

输入:

11 B A
5 @ W

输出:

 AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
 AAAAAAAAA

 @@@
@WWW@
@W@W@
@WWW@
 @@@

题解:

这道题属实是有点难,思考了很久没什么思路,最后看了教程才有有点想法。

分析:
1、先将4个角补上,成为一个正方形。
2、从最外圈的正方形向内圈的正方形逐步构造。
3、以正方形的左上角坐标与右下角坐标来表示该圈。
4、为每个圈填充中心字符和外筐字符。
5、确定每个圈的边长,即填充字符的个数
6、构造完成后剔除4个角。

在这里插入图片描述

#include <iostream>
#include <cstdio>

using namespace std;

const int MAX_NUM = 80;

/**
 * 叠筐--杭州电子科技大学
 * @return
 */
int main() {
    //二维矩阵存放字符
    char matrix[MAX_NUM][MAX_NUM];
    //外圈边长
    int n;
    //中心字符
    char centerChar;
    //外圈字符
    char outsideChar;

    //第一个案列
    bool firstCase = true;

    while (cin >> n >> centerChar >> outsideChar) {
        //每个叠筐间输出空行
        if (firstCase) {
            //第一个叠筐不输出空行
            firstCase = false;
        } else {
            //非第一个叠筐输出空行
            cout << endl;
        }

        //(i, i)表示每个圈最左上角坐标
        for (int i = 0; i <= n / 2; ++i) {
            //(j, j)表示每个圈最右下角坐标
            int j = n - 1 - i;
            //当前圈的边长
            int length = n - 2 * i;
            //当前圈的字符
            char currentChar;
            if ((n / 2 - i) % 2 == 0) {
                //距离为偶数
                currentChar = centerChar;
            } else {
                //距离为奇数
                currentChar = outsideChar;
            }

            /*
             * 为当前圈赋值
             */
            for (int k = 0; k < length; ++k) {
                //上边
                matrix[i][i + k] = currentChar;
                //下边
                matrix[i + k][i] = currentChar;
                //左边
                matrix[j - k][j] = currentChar;
                //右边
                matrix[j][j - k] = currentChar;
            }
        }

        /*
         * 除去四个角
         */
        if (n != 1) {
            matrix[0][0] = ' ';
            matrix[0][n - 1] = ' ';
            matrix[n - 1][0] = ' ';
            matrix[n - 1][n - 1] = ' ';
        }

        /*
         * 逐行打印二维数组
         */
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                cout << matrix[i][j];
            }
            cout << endl;
        }
    }
    return 0;
}

3、今年的第几天?–清华大学

描述

输入年、月、日,计算该天是本年的第几天。

输入描述:

包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。

输出描述:

输入可能有多组测试数据,对于每一组测试数据, 输出一个整数,代表Input中的年、月、日对应本年的第几天。

示例1

输入:

1990 9 20
2000 5 1

输出:

263
122

题解:

此题较基础,只需把每个月对应的天数加起来即可。但是,日期类问题有一个注意点就是“闰年”,每逢闰年,2月就会有29天。

#include <iostream>
#include <cstdio>

using namespace std;

/*
 * 0~12月份对应的天数
 */
int dayTable[2][13] = {
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},    //平年
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}     //闰年
};

/**
 * 判断是否为闰年
 * @param year
 * @return
 */
int isLeapYear(int year) {
    //return (year & 3 == 0 && year % 100 != 0) || year % 400 == 0;
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

/**
 * 今年的第几天?--清华大学
 * https://www.nowcoder.com/practice/ae7e58fe24b14d1386e13e7d70eaf04d?tpId=40
 * @return
 */
int main() {
    int year;
    int month;
    int day;
    while (cin >> year >> month >> day) {
        //记录天数
        int dayNumber = 0;
        int row = isLeapYear(year);
        for (int i = 0; i < month; ++i) {
            dayNumber += dayTable[row][i];
        }
        dayNumber += day;
        cout << dayNumber << endl;
    }

    return 0;
}

4 打印日期–华中科技大学

描述

给出年份m和一年中的第n天,算出第n天是几月几号。

输入描述:

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:

可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

示例1

输入:

2000 3
2000 31
2000 40
2000 60
2000 61
2001 60

输出:

2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01

题解:

注意判断“闰年”,按“yyyy-mm-dd”格式输出日期,格式不对也会判错。

#include <iostream>
#include <cstdio>

using namespace std;

/*
 * 空间换时间
 * 二维数组保存平年和闰年0~12月份对应的天数
 */
int dayTable[2][13] = {
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},    //平年
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}     //闰年
};

/**
 * 判断是否为闰年
 * 若是闰年,则返回1,对应dayTable[1][];反之,返回0,对应dayTable[0][]
 * @param year
 * @return
 */
int isLeapYear(int year) {
    //return (year & 3 == 0 && year % 100 != 0) || year % 400 == 0;
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

/**
 * 打印日期--华中科技大学
 * @return
 */
int main() {
    int year;
    int dayNumber;
    while (cin >> year >> dayNumber) {
        int month = 0;
        int day = 0;
        int row = isLeapYear(year);
        
        /*
         * 计算月份
         * 若dayNumber大于月份的天数,则减去对应天数
         * 同时,month++
         */
        while (dayNumber > dayTable[row][month]) {
            dayNumber -= dayTable[row][month];
            month++;
        }
        day = dayNumber;

        /*
         * 按格式输出日期
         * %2d表示输出宽度为2的整数,超过2位则按实际数据输出,不足2位则右对齐输出
         * %02d表示输出宽度为2的整数,超过2位则按实际数据输出,不足2位则前置补0
         * %5.2f表示输出宽度为5的浮点数,其中小数点后2位,不足5位则右对齐输出
         */
        printf("%04d-%02d-%02d\n", year, month, day);
    }
    return 0;
}

5 手机键盘–清华大学

描述

按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。

输入描述:

一个长度不大于100的字符串,其中只有手机按键上有的小写字母

输出描述:

输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间

示例1

输入:

bob
www

输出:

7
7

题解:

手机按键如下:

img

因为有些按键上面有三个字母,有些有四个字母,显然很难找到规律。所以,我们采用预处理策略,采取空间换时间的方式,将每个字母需要的按键次数先记录起来。每当遇到一个字母,直接访问数组便可得到该字母的按键次数。

由此,可得
abc   def   ghi   jkl   mno   pkrs   yuv   wxyz
123   123   123   123   123   1234   123   1234

定义一维数组,记录按键次数
int keyTable[26] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};

还有另外一个问题,若两个连续的字符来自同一个按键,按完第一个后中间需要等到一个时间段才能按第二个,那要怎么知道两个字符是否来自同一按键呢?

观察可知,若两个字符来自同一个按键,则字符之间的差值等于两个字符按键次数的差值。

对于与a和c,则有
字符的差值:c-a = 67-65 = 2
字符按键次数的差值:3-1 = 2

对于s和p,则有
字符的差值:s-p = 99-96 = 3
字符按键次数的差值:4-1 = 3
#include <iostream>
#include <cstdio>

using namespace std;

/*
 * 字符对应的按键次数
 */
int keyTable[26] = {1, 2, 3, 1, 2, 3, 1, 2, 3,
                    1, 2, 3, 1, 2, 3, 1, 2, 3,
                    4, 1, 2, 3, 1, 2, 3, 4};

/**
 * 手机按键--清华大学
 * @return
 */
int main() {
    string str;
    while (cin >> str) {
        int time = 0;
        for (int i = 0; i < str.size(); ++i) {
            time += keyTable[str[i] - 'a'];
            //连续的字符来自同一个按键
            if (i != 0 && (str[i] - str[i - 1] ==
                           keyTable[str[i] - 'a'] - keyTable[str[i - 1] - 'a'])) {
                time += 2;
            }
        }
        cout << time << endl;
    }
    
    return 0;
}

三、总结

本章学习收获颇丰,很多的题目都是来自于各大名校的复试题,记录一下笔记,方便自己回顾。

参考教材–《王道计算机考研——机试指南》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java课程设计——学生成绩管理系统

1 需求分析1.1 需求分析概述需求分析是开发软件系统的重要环节&#xff0c;是系统开发的第一步和基础环节。通过需求分析充分认识系统的目标、系统的各个组成部分、各部分的任务职责、工作流程、工作中使用的各种数据及数据结构、各部门的业务关系和数据流程等&#xff0c; 为系…

nacos的配置管理

前言 此博客对nacos的配置管理进行简单介绍&#xff0c;如果降配置文件放在项目中&#xff0c;那么每次进行修改后都要重新编译部署项目&#xff0c;是极其不方便的&#xff0c;如果将配置文件放在一个固定的位置&#xff0c;尽管解决了以上的问题&#xff0c;但是管理起来还不…

【Java寒假打卡】Java基础-File

【Java寒假打卡】Java基础-File概述-三种构造方法绝对路径和相对路径File的创建功能File的删除功能File的判断和获取功能listFile方法练习1&#xff1a;在当前模块下面aaa文件夹创建一个文件a.txt练习2&#xff1a;删除一个多级文件夹练习3&#xff1a;统计一个文件夹中每一种文…

UE插件和项目目录结构学习笔记

Plugins插件的二种安装方式 1、安装到虚幻引擎&#xff08;推荐&#xff09; 转到虚幻引擎安装位置的插件文件夹 Engine/Plugins 将解压得到的插件文件夹放入Marketplace文件夹下&#xff08;如没有新建一个&#xff09;。 启动虚幻引擎打开项目&#xff0c;菜单->编辑->…

如何在线免费将PPT转PDF格式

我们经常会遇到制作演示文稿PPT的格式&#xff0c;但是这种格式一般在传阅的过程中稳定性都较差&#xff0c;所以很多人会选择转成PDF格式&#xff0c;那么有没有免费的处理方式呢&#xff1f; 打开浏览器搜索speedpdf找到并打开在线转换工具首页&#xff0c;选择主页上的PPT转…

Python表白妙招,把情书写进她的照片里

前言 我的好兄弟们&#xff0c;2022年可算是过去了&#xff0c;这不马上要过年了吗 就是说&#xff0c;各位兄弟有对象了吗&#xff0c;没有的回家还要面对亲戚的各种提问 退一步来说&#xff0c;有心仪的人吗&#xff0c;如果有的话&#xff0c;就来看看这篇 程序员的表白小…

【Vue + Koa 前后端分离项目实战7】使用开源框架==>快速搭建后台管理系统 -- part7 前端实现最新期刊管理【增删查改】

人生没有白走的路&#xff0c;每一步都作数。 对应后端部分章节回顾&#xff1a; 【Vue Koa 前后端分离项目实战5】使用开源框架&#xff1e;快速搭建后台管理系统 -- part5 后端实现最新期刊列表管理【增删查改】_小白Rachel的博客-CSDN博客 效果展示&#xff1a; 目录 一、…

少儿Python每日一题(15):回文数

原题解答 本次的题目如下所示: 【编程实现】 回文数是指一个像14641这样“对称”的数,即:将这个数的各位数字按相反的顺序重新排列后,所得到的数和原来的数一样。请编程求不同位数数字的回文数的个数。用户输入一个正整数M(2<M<7),M作为回文数的位数。要求输出M位…

【Javascript】高阶函数,JSON

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录高阶函数箭头函数apply函数JSON高阶函数 把函数作为参数&#xff0c;或者返回一个函数&#xff…

【并发】并发锁机制-深入理解synchronized(一)

【并发】并发锁机制-深入理解synchronized&#xff08;一&#xff09; synchronized 基础篇&#xff08;使用&#xff09; 一、Java共享内存模型带来的线程安全问题 1. 代码示例 2. 运行结果 3. 问题分析 4. 临界区&#xff08;Critical Section&#xff09; 5. 竞态条件…

【Go】内存模型中的内存可见性

前言 使用go必然会使用到协程以及其他的并发操作&#xff0c;初期学习的时候&#xff0c;经常在启动协程时操作变量出现问题&#xff0c;要么就是变量没更新&#xff0c;要么就是各种崩溃&#xff0c;或者vscode报告警之类的&#xff0c;于是浅看了一下Go的内存模型&#xff0…

离散制造业ERP系统对生产物料管理有哪些帮助?

在离散制造企业生产加工过程中&#xff0c;生产物料管理是一个至关重要的环节。车间物料能不能管控好&#xff0c;影响着整个产品的品质、工作效率及制造成本的控制等。离散制造业通常需要品类、属性繁多的原材料和配套件&#xff0c;而各类物料的及时供应十分重要&#xff1b;…

优思学院|QCC 是什么意思?有什么用?

QCC 的中文意思是质量控制圈&#xff0c;也有人称为品质圈。 质量控制圈&#xff08;QCC&#xff09;是来自日本的一种质量管理方法&#xff0c;这个概念的作者是石川馨、日本科学家和工程师联盟&#xff08;JUSE&#xff09;共同发明。 QCC的方法是建立由5-11名成员组成的小团…

【VUE2-01】vue2的起步

文章目录一、初识vue1.1vue.js的特点1.2什么是虚拟的dom&#xff1f;1.3为什么使用虚拟的dom1.4vue设计思想二、第一个vue应用如果想系统细致的学习&#xff0c;建议阅读vue的官方网站目前vue官网默认的是vue3的内容&#xff0c;此篇以vue2为基础开始学习一、初识vue 1.1vue.j…

电脑重装系统后没声解决步骤

电脑重装系统之后&#xff0c;发现声音功能&#xff0c;不能正常使用了。对于电脑小白来说&#xff0c;不知道该如何处理&#xff0c;下面就和大家说说重装系统后没声音怎么办呢?&#xff0c;其实完全可以自己处理这种情况&#xff0c;快来看看小白重装系统后没声解决方法吧! …

插入损耗——线对上的信号衰减

“您好&#xff0c;我需要您的帮助。我在测试长距离线缆的时候&#xff0c;插入损耗没有通过测试&#xff01;”这是在对铜缆布线进行验收测量时&#xff0c;我们经常能够听到的问题。针对这一情况&#xff0c;为了能提供更专业的支持&#xff0c;我们必须了解这一电气特性的基…

如何修改linux下的vim复制行数限制

vim-如何修改linux下的vim复制行数限制来自北方的小强正在努力成为资深数字IC搬砖工的搬砖工个人根目录下的.vimrc (~/.vimrc)添加如下内容:set viminfo1000,<600linux下&#xff0c;默认最多复制50行&#xff0c;上述修改即将限制改为600行。注意&#xff1a;1 如果.vimrc文…

Arduino固件库的离线安装方式

参考&#xff1a;https://www.cnblogs.com/hilary0614/p/libraries.html https://jingyan.baidu.com/article/9f7e7ec09d90906f281554e1.html&#xff0c;开发板管理器和管理库区别 Arduino 经常推出新的控制器&#xff0c;这些新的控制器可能不在现有的板子型号中&#xff0c;…

【Linux】Linux 项目自动化构建工具 -- make/makefile

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、概念三、demo 实现四、原理与规则1、依赖关系和依赖方法① 感性理解② 深层理解…

回顾 2022

前言回顾过去的 2022 年&#xff0c;感觉自己学习了不少&#xff0c;输出的不多。适合 Golang 新手入门的项目 go-gin-api[1]&#xff0c;今年基本没更新&#xff0c;目前已收到 4.1k star&#xff0c;感谢大家的认可。关于健康今年室外跑步&#xff0c;跑了有 175 km&#xff…