算法训练第一周考试(思维性题目)

目录

第一题.满足约束

第二题:传递信息 

第三题:无线替换

 第四题:环球旅行

第五题:求和游戏

第六题:大相径庭数组

总结:其实这次考试主要都是一些思维性的题集,并没有过难的东西,只要能找到其中的式子,每道题都可以很简单的求解出来,而且计算机本身就是与数学有很大的关系,其中简单来说,唯有坚持下来,掌握思维,但是主要也是凭借个人的努力,若不努力,至强者也有可能变为弱者,才可在计算机领域做出一番贡献。



水题:国际象棋(超级水题建议直接跳过)

题解:很水的一道题,没什么技术含量,就只需要判断那个字母没出现过,进行判断就可以了

(竖着移动是字母不变数字变,横着移动是数字不变字母变,到了原位置分别判断一下即可)

AC代码:

#include <stdio.h>
#include <stdlib.h>
char a,b;
char c[9]={'1','2','3','4','5','6','7','8','\0'};//存储棋盘的纵坐标
char d[9]={"abcdefgh"};//存储棋盘的横坐标
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf(" %c%c",&a,&b);//输入当前落子的坐标
        for(int i=0;i<8;i++)
        {
            if(d[i]!=a)//输出横向移动的可能
            {
                printf("%c%c\n",d[i],b);
            }
        }
        for(int i=0;i<8;i++)
        {
            if(c[i]!=b)//输出纵向移动的可能
            {
                printf("%c%c\n",a,c[i]);
            }
        }
    }
    return 0;
}

第一题.满足约束

题解:其实这道题就是一道小学思维题,去寻找一个区间内符合的数的多少,对于1条件,我们可以把它视为前面的卡的范围,若有不同的1,则将对应的最大值更新,对于2条件,我们应当视为后面的卡的范围,若有不同的2,则应将其对应的最小值更新,这样才能卡到最精确的范围,对于3,我们只需要看3的数字有多少在这个范围内,相应减去就可以得到结果,话不多说

AC代码:

#include <stdio.h>
#include <stdlib.h>
int a[105];//约束条件类型
int x[105];//约束条件对应的数字
int c[105];//3类型中放的数字
int max(int x,int y)//用于更新1的最大值
{
    return x>y?x:y;
}
int min(int x,int y)//用于更新2的最小值
{
    return x<y?x:y;
}
int main()
{
    int t;
    scanf("%d",&t);//输入测试样例的数量
    while(t--)
    {
        int n;
        scanf("%d",&n);输入有多少组数
        int k=0;
        int sx=0,fx=0x3f3f3f3f;//sx代表范围的左位置,fx代表范围的右位置
        for(int i=0; i<n; i++)
        {
            scanf("%d %d",&a[i],&x[i]);
            if(a[i]==1)
            {
                sx=max(x[i],sx);//更新范围的左端
            }
            if(a[i]==2)
            {
                fx=min(x[i],fx);//更新范围的右端
            }
            if(a[i]==3)
            {
                c[k++]=x[i];//存储类型3的元素
            }
        }
        int count=fx-sx+1;//定义数字的数量count
        for(int i=0;i<k;i++)
        {
            if(c[i]>=sx&&c[i]<=fx)
            {
                count--;//只要类型3的元素在这个范围内有就要-1
            }
        }
        if(count<0)
        {
            count=0;//有可能会出现小于0的情况
        }
        printf("%d\n",count);
    }
    return 0;
}

第二题:传递信息 

 题解,也是很简单的一道思维题目,只需要计算每次间隔到底是要关机还是开机等时间

计算发完消息最小的耗电量,然后和电量作对比即可

#include <stdio.h>
#include <stdlib.h>
unsigned long long m[200005];//用于统计每次发消息的时间点
unsigned long long min(unsigned long long x,unsigned long long y)
{
    return x<y?x:y;//取小值
}
int main()
{
    int t;
    scanf("%d",&t);//输入测试样例
    while(t--)
    {
        unsigned long long n,f,a,b;//分别输入消息数,剩余电量,单位时间耗电,还有关机所用电量
        scanf("%llu%llu%llu%llu",&n,&f,&a,&b);
        for(int i=1; i<=n; i++)
        {
            scanf("%llu",&m[i]);//输入每条消息的时间点
        }
        unsigned long long t=0;//定义总时间t
        for(int i=0; i<n; i++)
        {
            t+=min((m[i+1]-m[i])*a,b);//每次取时间段的最小耗电量
        }
        if(f>t)//若剩余电量大于最小耗电量,那么就可以发送完毕
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}

第三题:无线替换

题解,纯思维题目,没有任何技巧可言,只需要判断三种情况

1.什么时候有无限种情况,当下面的字符串带有a且长度不为1时可以无限延伸,从而实现无限种可能

2,.什么时候会有一种可能呢,那就是下面的字符串是a,且长度为1

3.当时正常情况的时候我们可以将底下的串当成一个整体,进行插入,若至少替换一个的话,就可以找到规律,写出通项式存储在数组中,最后加上不变的情况就好,但是要注意数组要开的大一点,不然有些数据过不去

话不多说,看AC代码

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
unsigned long long dp[51];//用于存储上面字符串长度对应的结果数
unsigned long long jie(unsigned long long n)//将数据开的大了一点
{
    dp[1]=1;
    for(int i=2;i<=50;i++)
    {
        dp[i]=dp[i-1]*2+1;
    }
    return dp[n];//返回对应的结果
}
int main()
{
    int q;
    scanf("%d",&q);
    while(q--)
    {
        char s[60];
        char t[60];
        scanf("%s",s);//输入对应的字符串
        scanf("%s",t);
        getchar();
        unsigned long long len1=strlen(s);
        unsigned long long len2=strlen(t);
        unsigned long long count=0,flag=0;
        for(int i=0; i<len2; i++)
        {
            if(t[i]=='a'&&len2!=1)
            {
                flag=1;
                printf("-1\n");//第一种情况的特判
                break;
            }
            if(t[i]=='a'&&len2==1)
            {
                flag=1;
                printf("1\n");//第二种情况的特判
                break;
            }
        }
        if(flag==0)
        {
            count=jie(len1);
            printf("%llu\n",count+1);//普通情况的求解
        }
    }
    return 0;
}

 第四题:环球旅行

题解,这题需要用到前缀和 

#include <stdio.h>
#include <stdlib.h>
unsigned long long a[100005], b[100005], c[100005];

// 定义比较大小的函数
int max(int x, int y)
{
    return x > y ? x : y;
}
// 定义比较大小的函数
int min(int x, int y)
{
    return x < y ? x : y;
}

int main()
{
    int n, m;
    // 输入 n 和 m 的值
    scanf("%d%d", &n, &m);
    // 输入每一列的高度
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &a[i]);
    }
    // 计算向上和向下移动时的伤害
    for (int i = 1; i <= n - 1; i++)
    {
        b[i] = b[i - 1] + max(a[i] - a[i + 1], 0);
        c[i] = c[i - 1] + max(a[i + 1] - a[i], 0);
    }
    while (m--)
    {
        int s, t;
        // 输入移动的起始和目标位置
        scanf("%d%d", &s, &t);

        if (s < t)
        {
            // 输出向上移动的伤害
            printf("%llu\n", b[t - 1] - b[s - 1]);
        }
        else
        {
            // 输出向下移动的伤害
            printf("%llu\n", c[s - 1] - c[t - 1]);
        }
    }

    return 0;
}

第五题:求和游戏

Summation Game

题解:首先需要考虑的是爱丽丝该删去哪些数,因为要去最优解,那么肯定是要去删除最大的值,因为假如把最大值留着,这个鲍勃肯定回下黑手乘-1,使其变为最小值,不利于爱丽丝的使和最大的策略,对应的结果应当是s[n]-s[n-k]

对于鲍勃而言,修改x的个数的话,我们需要考虑修改剩下的较大的数,这样才能有最优策略,使和最小,那么对应的结果为2*s[max(n-i-x,0)]-s[n-i]

因此我们可以得到求解这题的思路,首先就是现将数组排序,因为爱丽丝和鲍勃都是对最大的部分进行操作,因此我们可以用i去遍历爱丽丝的选择,从去掉0个遍历到去掉k个,即我们的循环从

n-k,一直遍历到k,不变的部分就是s[i-x],若是i-x小于0的话就是s[0],变动的部分就是s[i]-s[i-x],

变动的部分是鲍勃将后面的大数变为相反数,即给变动部分加个负号即可,这题有一个减少时间复杂度的部分就是用前缀和统计一下每个部分的大小,方便后面的计算

本题考点前缀和以及排序(手写快排一直过不去,所以直接调用了C++的sort函数)

#include<bits/stdc++.h>
using namespace std;
int a[200005];
int s[200005];
int main()
{
    int t;
    scanf("%d",&t);//输入测试用例数量
    while(t--)
    {
        int n,k,x;
        scanf("%d%d%d",&n,&k,&x);//输入数组长度n,删除元素数量k,以及x的值
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);//输入数组元素
        }
        sort(a+1,a+n+1); //对数组进行排序
        for(int i=1; i<=n; i++)
        {
            s[i]=s[i-1]+a[i];//计算前缀和
        }
        int sum=-0x3f3f3f3f;//初始化结果为一个较小的值
        for(int i=max(0,n-k); i<=n; i++)//模拟从k取最大到k取0
        {
            sum=max(sum,s[max(0,i-x)]-(s[i]-s[max(0,i-x)]));//计算最大值,
//第一部分的s[max(0,i-x)]代表的是绝对不会受到影响的部分,这些直接相加即可
//第二部分是(s[i]-s[max(0,i-x)])求鲍勃这个人将会反转的数的大小,通过前缀和将后几个数的大小求出来,然后前面加个负号,代表相反数
        }
        printf("%d\n",sum);
    }
    return 0;
}

第六题:大相径庭数组

Very Different Array

题解:求最大值肯定是要用双指针去寻找前后两项的差值,具体来说,对于数组a中的第i个元素,计算它与数组b中倒数第i个元素的差的绝对值,以及它与数组b中正数第i个元素的差的绝对值,然后将这两个绝对值中较大的那个加到sum中。

考点:双指针排序(排序还是用的sort函数,别问我为什么,问就是和上个题一样手写代码被WA了)别人都是手撕代码,我是纯被代码手撕

第一种做法:

#include <bits/stdc++.h>
using namespace std;
int a[300000];//用于存储弟弟的数组
int b[300000];//用于存储哥哥的数组
int main()
{
    int t;
    scanf("%d",&t);//输入测试样例的数量
    while (t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);//输入弟弟和哥哥各自元素的数量
        for (int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);//输入弟弟手中的数组
        }
        for (int i=0; i<m; i++)
        {
            scanf("%d",&b[i]);//输入哥哥手中的数组
        }
        sort(a,a+n);//对两个数组进行升序排序
        sort(b,b+m);
        long long sum=0;//sum表示最终结果
        for (int i = 0; i<n; i++)//遍历a数组中的每一个元素,去和b数组找出最大差值
        {
            sum+=max(abs(a[i]-b[m-i-1]), abs(a[i]-b[n-i-1]));//求取最大值
        }
        printf("%lld\n",sum);
    }
    return 0;
}

第二种做法:(ps:来自于我一个兄弟)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,x,y,temp;
    scanf("%d",&n);
    while(n--){
        set<int>a,b;
        set<int>::iterator l1,l2,r1,r2;    //众所周知set里只能有一个重复元素
        map<int,int>maps1,maps2;//原本想用数组当作桶的但是ai和bi太大了只能映射了
        long long sum=0;//数据看起来还是比较大的
        scanf("%d %d",&x,&y);
        for(int i=1;i<=x;i++){
            scanf("%d",&temp);
            maps1[temp]++;//若同一个元素有多个则记录一下
            a.insert(temp);//将元素插入容器a
        }
        for(int i=1;i<=y;i++){
            scanf("%d",&temp);
            maps2[temp]++;
            b.insert(temp);
        }
        while(!a.empty()){//思路证明过程不详
            l1=a.begin(),l2=b.begin(),r1=a.end(),r2=b.end();//l1,l2,r1,r2分别是两个数组的最小和最大元素
            r1--,r2--;//至于为什么减减是因为end返回的是最后一个元素的下一个位置的迭代器
            if(abs(*r1-*l2)>abs(*l1-*r2)){
                sum+=(int)abs(*r1-*l2);
                maps1[*r1]--;
                maps2[*l2]--;
                if(maps1[*r1]==0)a.erase(*r1);//如果删除到数量为0了就在set中将其删除
                if(maps2[*l2]==0)b.erase(*l2);
            }
            else{
                sum+=(int)abs(*l1-*r2);
                maps1[*l1]--;
                maps2[*r2]--;
                if(maps1[*l1]==0)a.erase(*l1);
                if(maps2[*r2]==0)b.erase(*r2);
            }
        }
        printf("%lld\n",sum);
    }
    return 0;
}

总结:其实这次考试主要都是一些思维性的题集,并没有过难的东西,只要能找到其中的式子,每道题都可以很简单的求解出来,而且计算机本身就是与数学有很大的关系,其中简单来说,唯有坚持下来,掌握思维,但是主要也是凭借个人的努力,若不努力,至强者也有可能变为弱者,才可在计算机领域做出一番贡献。

寄语:(ps:写给我女朋友的)(个位看官建议跳过这部分)

朝朝思,夜夜看

我对你的思念如同那北极星一样,亘古不变

你眼中有春与秋,胜过我爱过见过的一切山川与河流

我走过许多地方

我见过春日夏风 秋叶冬雪

也踏遍南水北山 东麓西岭

都没什么好看的

都不及那个黄昏,冲我展眉一笑的你

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

五、防御保护---防火墙出口选路篇

五、防御保护---防火墙智能选路篇 一、就近选路二、策略路由选路1.策略路由的概念1.1匹配条件&#xff08;通过ACL定义&#xff09;1.2动作 三、智能选路 --- 全局路由策略1.基于链路带宽的负载分担2.基于链路质量进行负载分担3.基于链路权重进行负载分担4.基于链路优先级的主备…

shell - sed命令和awk命令

一.sed 的高级用法 sed 中除了模式空间&#xff0c;还另外支持保持空间&#xff0c;利用此空间&#xff0c;可以将模式空间中的数据&#xff0c;临时保存至保持空间&#xff0c;从而后续接着处理&#xff0c;实现更为强大的功能。 常见命令&#xff1a; 选项含义P(大)打印模…

【MySQL】学习如何通过DQL进行数据库数据的基本查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KvH5jXnPNsRtMkOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Docker部署Plik系统并结合内网穿透实现远程访问本地上传下载文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

思路&#xff1a; 解法二&#xff1a;生产者-消费者解法 1.把 hydrogen 线程看作生产者&#xff0c;oxygen 线程看作消费者&#xff0c;缓冲队列大小为2。 2.hydrogen 把生成的氢放入队列&#xff1b;oxygen 线程每次从队列里消费两个氢元素。 3.生产者生产两个氢元素后会因为…

找不到xinput1_4.dll怎么办?xinput1_4.dll丢失的6种解决方法对比

无法找到或缺失xinput1_4.dll文件可能会引发一系列问题&#xff0c;这一现象在计算机系统中并不罕见。首先&#xff0c;它直接影响到某些应用程序的正常运行&#xff0c;特别是那些依赖于DirectX环境的游戏和软件&#xff0c;因为xinput1_4.dll是DirectX工具包中的一个重要组成…

ElementUI组件:Button 按钮

button按钮 点击下载learnelementuispringboot项目源码 效果图 el-button.vue页面效果图 项目里el-button.vue代码 <script> export default {name: "el_button",// 注意这里的名称不能和 router inex.js里的name一样methods: {sendMsg() {// alert(1)xthi…

皮层肌肉相干性(CMC)的介绍和实现

皮层肌肉相干性CMC的介绍和实现 0 引言1 CMC定义2 CMC实现(Python)3 总结欢迎来稿0 引言 皮质肌肉相干性(CMC)是研究大脑皮层控制肌肉活动机制的常用且有用的方法。它揭示了肌肉持续收缩期间皮层和肌肉之间的功能联系。CMC的起源是初级运动皮层和肌肉之间皮质脊髓通路的通…

飞桨大模型分布式训练技术

今天我为大家介绍飞桨大模型分布式训练技术&#xff0c;内容分为以下几个部分&#xff1a; 首先&#xff0c;我会介绍大模型训练面临的重点难题&#xff1b;然后&#xff0c;为大家介绍飞桨在大模型训练领域的特色分布式训练技术和优化方案&#xff1b;最后&#xff0c;伴随着…

【STM32】STM32学习笔记-SPI通信外设(39)

00. 目录 文章目录 00. 目录01. SPI简介02. SPI特征03. SPI外设简介04. SPI框图05. SPI基本结构06. 主模式全双工连续传输07. 非连续传输08. 软件/硬件波形对比09. 附录 01. SPI简介 在大容量产品和互联型产品上&#xff0c;SPI接口可以配置为支持SPI协议或者支持I2S音频协议。…

第十九回 梁山泊义士尊晁盖 郓城县月夜走刘唐-FreeBSD Ubunut系统后台运行程序

林冲请晁盖坐了第一把交椅&#xff0c;吴用坐了第二把交椅&#xff0c;公孙胜坐了第三把交椅&#xff0c;还想让&#xff0c;晁盖吴用公孙胜都不肯接受相让&#xff0c;因此林冲坐了第四把交椅。 一天小喽啰报济州府派了2000人马来攻打梁山。吴用说不须兄长挂心&#xff0c;吴某…

学习使用Flask模拟接口进行测试

前言 学习使用一个新工具&#xff0c;首先找一段代码学习一下&#xff0c;基本掌握用法&#xff0c;然后再考虑每一部分是做什么的 Flask的初始化 app Flask(__name__)&#xff1a;初始化&#xff0c;创建一个该类的实例&#xff0c;第一个参数是应用模块或者包的名称 app…

webassembly003 TTS BARK.CPP-02-bark_tokenize_input(ctx, text);

bark_tokenize_input函数 bark是没有语言控制选项的&#xff0c;但是官方的版本无法运行中文bark_tokenize_input会调用bert_tokenize函数&#xff0c;bark_tokenize_input函数对中文分词失效&#xff0c;也就是导致不支持中文的原因。 void bark_tokenize_input(struct bark_…

Mybatis Plus轻松实现数据库变更全局审计日志

Mybatis Plus轻松实现数据库变更全局审计日志 Mybatis Plus轻松实现数据库变更全局审计日志引言实现审计日志1.创建审计日志表2.创建AuditLogAspect用于记录请求日志4. 保存审计日志 总结 Mybatis Plus轻松实现数据库变更全局审计日志 引言 在日常的业务开发中&#xff0c;监…

MySQL十部曲之一:MySQL概述及手册说明

文章目录 数据库、数据库管理系统以及SQL之间的关系关系型数据库与非关系型数据库MySQL程序系统变量系统状态变量SQL模式MySQL数据目录手册语法约定 数据库、数据库管理系统以及SQL之间的关系 名称说明数据库&#xff08;Database&#xff09;即存储数据的仓库&#xff0c;其本…

07. STP的基本配置

文章目录 一. 初识STP1.1. STP概述1.2. STP的出现1.3. STP的作用1.4. STP的专业术语1.5. BPDU的报文格式1.6. STP的选择原则&#xff08;1&#xff09;选择根桥网桥原则&#xff08;2&#xff09;选择根端口原则 1.7. 端口状态1.8. STP报文类型1.9. STP的收敛时间 二. 实验专题…

数据结构——并查集

1.并查集的定义 并查集其实也是一种树形结构&#xff0c;在使用中通常用森林的方式来表示 并查集的逻辑结构其实就是集合 并查集一般可以通过双亲写法&#xff08;顺序结构&#xff09;来完成&#xff0c;即通过一个数组存储父亲结点的下标 int s[10005]; int main() {for(…

原来服务器这么有用-使用轻量应用服务器搭建专属自己PDF处理工具

原来服务器这么有用-使用轻量应用服务器搭建专属自己PDF处理工具 1、前言 PDF文件是日常办公中经常使用的一种文档格式。最近&#xff0c;青阳面临一个问题&#xff1a;某公司发送过来的文件需要我们进行印章流程&#xff0c;但由于该公司系统在电子文件加盖电子公章后会自动…

万户 ezOFFICE wpsservlet SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

10V单通道负载开关

概述 EM5220是一款单通道负载开关&#xff0c;具有可编程上升时间和集成输出放电控制。该设备包含一个P沟道NOSFET&#xff0c;可以通过输入进行操作电压范围为4.5V至10V。开关由接通和断开低电平逻辑输入控制&#xff0c;其能够与GPIO信号接口。设备的可编程上升时间可以减少…
最新文章