SDU 程序设计思维实践 第四周 csp模拟

2023-05-16

文章目录

  • 题目A - 咕咕东的奇遇
    • 题意
      • Input
      • Output
    • 思路
    • 总结
    • 代码
  • 题目B - 咕咕东想吃饭
    • 题意
      • Input
      • Output
    • 思路
    • 总结
    • 代码
  • 题目C - 可怕的宇宙射线
    • 题意
      • Input
      • Output
    • 思路
    • 总结
    • 代码

题目A - 咕咕东的奇遇

题意

咕咕东是个贪玩的孩子,有一天,他从上古遗迹中得到了一个神奇的圆环。这个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a。咕咕东每次可以顺时针或者逆时针旋转一格。例如,a顺时针旋转到z,逆时针旋转到b。咕咕东手里有一个字符串,但是他太笨了,所以他来请求你的帮助,问最少需要转多少次。

在这里插入图片描述

Input

zeus

Output

18

思路

考虑上衣字符拨到当前字符逆时针还是顺时针即可。

具体的判断可以用,注意取模:

  • 顺时针: 当前字符 − - 上一字符
  • 逆时针:26 − - (当前字符 − - 上一字符)

总结

憨憨的我上来直接24个英文字母。签到题

代码

#include <iostream>
#include <cstdio>
using namespace std;
int main() {
    string s;
    cin >> s;
    int ans = 0;
    int k = 0;
    for (int i = 0; i < s.size(); i++) {
        int cur = (26 + s[i] - 'a' - k) % 26;
        // ans += min((s[i] - 'a' - k) % 26, 26 - ((s[i] - 'a' - k) % 26));
        ans += min(cur, 26 - cur);
        k = s[i] - 'a';
        // cout << k << " " << ans << endl;
    }
    cout << ans;
    return 0;
}

题目B - 咕咕东想吃饭

题意

咕咕东考试周开始了,考试周一共有 n n n天。他不想考试周这么累,于是打算每天都吃顿好的。他决定每天都吃生煎,咕咕东每天需要买 a i a_i ai个生煎。但是生煎店为了刺激消费,只有两种购买方式:①在某一天一次性买两个生煎。②今天买一个生煎,同时为明天买一个生煎,店家会给一个券,第二天用券来拿。没有其余的购买方式,这两种购买方式可以用无数次,但是咕咕东是个节俭的好孩子,他训练结束就走了,不允许训练结束时手里有券。咕咕东非常有钱,你不需要担心咕咕东没钱,但是咕咕东太笨了,他想问你他能否在考试周每天都能恰好买 a i a_i ai个生煎。

其中

( 1 ≤ n ≤ 100000 ) (1 \le n \le 100000) (1n100000) ( 1 ≤ a i ≤ 10000 ) (1 \le a_i \le 10000) (1ai10000)

Input

4
1 2 1 2

Output

2

思路

考虑对于第 i i i天,假设买了m个煎饼,其第二种方案对第 i + 1 i+1 i+1天的影响可以转变为至多一次。

因为,假设第 i i i天选了2次方案二,其等价于第 i i i天选1次方案一,第 i + 1 i + 1 i+1天选1次方案一。

故问题可以转化为先考虑最后一天,若为偶数个,直接全选择方案1,若为奇数个,选择一次方案1。并让前一天总煎饼数-1(选择一次方案2)。


则问题转化为,对于当前天:

  • 若煎饼数为偶数,则继续。
  • 若煎饼数为基数,则令前一天煎饼数-1。

输出NO的情况为当前天煎饼数 < 0 <0 <0 ,或第一天煎饼数为基数个。否则输出YES

总结

这题还是挺有意思的,不过数据有点水(逃) 。全输出YES能拿到不少分吧。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
int v[100010];
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
    }
    int flag = 0;
    for (int i = n; i; i--) {
        if (flag == 1) {
            v[i] -= 1;
            if (v[i] < 0) {
                cout << "NO";
                return 0;
            }
        }
        if (v[i] % 2 == 0) {
            flag = 0;
        } else {
            flag = 1;
        }
    }
    if (flag == 1) {
        cout << "NO";
    } else {
        cout << "YES";
    }
    return 0;
}

题目C - 可怕的宇宙射线

题意

众所周知,瑞神已经达到了CS本科生的天花板,但殊不知天外有天,人外有苟。在浩瀚的宇宙中,存在着-种叫做苟狗的生物, 这种生物天生就能达到人类研究生的知识水平,并且天生擅长CSP,甚至有全国第一的水平!但最可怕的是,它可以发出宇宙射线!宇宙射线可以摧毁人的智商,进行降智打击!

宇宙射线会在无限的二维平面上传播(可以看做一个二维网格图),初始方向默认向上。宇宙射线会在发射出一段距离后分裂,向该方向的左右 4 5 ∘ 45^{\circ} 45方向分裂出两条宇宙射线,同时威力不变!宇宙射线会分裂 n n n次,每次分裂后会在分裂方向前进 a a a个单位长度。

现在瑞神要带着他的小弟们挑战苟狗,但是瑞神不想让自己的智商降到普通本科生zjm那么菜的水平,所以瑞神来请求你帮他计算出共有多少个位置会被"降智打击”。

在这里插入图片描述

Input

4
4 2 3 2

Output

39

思路

朴素的DFS,和BFS能拿到40分。据说剪枝后可以A掉,但是要注意考虑层数,(第4次和21次以同一方向道道某个点并不能剪掉),否则会WA。下面给出一种好的解法(这里感谢下hf大佬。

首先考虑分裂30次, 2 30 2^{30} 230显然会TLE。考虑每次分裂是对称的,其实我们只需要考虑一半就行,如只考虑向右边分裂,把分裂后的图沿着对称轴对称过去,这样问题变成了30次图的对称复制。

至于怎么对称,考虑:

在这里插入图片描述

我们已知线段L,点A,求点A的对称点B。

那么问题就很简单了,高数学过(我却忘了,LY老师Dbq):

  • 对于上、下、左、右。很简单
  • 对于其它方向,用下式推导,结果很好看。

在这里插入图片描述

总结

set用法
这题我算错复杂度了,以为朴素的dfs就能A。(问问自己,第几次这样了???)。然后玩了半小时(RNG NB)。最后看出来怎么做了,奈何不会算对称点,最后拿了暴力的40分,只能补题了。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
struct re {
    int x, y;
    bool operator<(const re& a) const { return x != a.x ? x < a.x : y < a.y; }
};
set<re> M;
int ans;
int fx[] = {0, 1, 1, 1, 0, -1, -1, -1};
int fy[] = {1, 1, 0, -1, -1, -1, 0, 1};
int v[50], n;
void dfs(re cur, int k, int flag) {
    if (k > n) return;
    // cout << k << " " << flag << endl;
    dfs({cur.x + fx[flag] * v[k], cur.y + fy[flag] * v[k]}, k + 1, (flag + 1) % 8);
    set<re> temp;
    for (auto& i : M) {
        if (flag == 0 || flag == 4)
            temp.insert({cur.x * 2 - i.x, i.y});
        else if (flag == 1 || flag == 5)
            temp.insert({i.y + cur.x - cur.y, i.x - cur.x + cur.y});
        else if (flag == 2 || flag == 6)
            temp.insert({i.x, cur.y * 2 - i.y});
        else if (flag == 3 || flag == 7)
            temp.insert({cur.x + cur.y - i.y, cur.x + cur.y - i.x});
    }
    M.insert(temp.begin(), temp.end());
    for (int i = 1; i <= v[k]; i++) {
        M.insert({cur.x + fx[flag] * i, cur.y + fy[flag] * i});
    }
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
    }
    dfs({0, 0}, 1, 0);
    cout << M.size();
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SDU 程序设计思维实践 第四周 csp模拟 的相关文章

  • 1191:流感传染

    1191 xff1a 流感传染 题目描述 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人 xff0c 也可能空着 在第一天 xff0c 有些房间里的人得了流感
  • 每个程序员半小时内必须解决的5个编程问题(C语言实现)

    最近关注的几个算法的公众号都看到了如题的一篇文章 xff0c 后1道题单拿出来我肯定不能半个小时内解决 前三道题非常基础 xff0c 相信大部分人能用自己熟悉的语言很快解决 xff0c 而且解决的方法可以多种多样 xff0c 这里说一下我对
  • 算法导论学习笔记02——最大子数组问题

    最大子数组问题 xff1a 输入一个数组A xff0c 在数组A的众多非空连续子数组中 xff0c 找到和最大的一个 目录 暴力求解方法 分治思想求解 分治思想C代码 测试脚本 暴力求解方法 对一个长度为A的数组 xff0c 可以存在个非空
  • Linux中各文件占用的Cache统计

    统计Linux中各个文件占用cache的情况 xff0c 使用工具fincore 可以从GitHub上获取到源码 xff1a https github com david415 linux ftools git 下载后 xff0c conf
  • 算法导论学习笔记05——求一个数列中第N大的数字

    本篇文章根据快速排序的分治思想在排序的情况下求解一个数列中第N大的数字 关于快速排序的原理和实现算法导论学习笔记04 快速排序 快速排序中介绍了一种PARTITION 函数 xff0c 它将原数组A r 使用一个主元x xff08 A 的某
  • 求最大数和最小数的最大公约数

    从键盘输入10个正整数 xff0c 求出最大数 xff0c 最小数 xff0c 以及他们的最大公约数 要求用数组实现 程序运行结果示例1 xff1a Input 10 numbers 15 23 56 87 94 105 78 19 22
  • 文件名排序(自然序)

    文件名就是一个字符串 xff0c 在对两个文件名进行比较时 xff0c 当文件名中有数字时 xff0c 仅仅按照字典序逐个字符的比较会出现如下不合理的情况 xff1a 文件 xff1a 10 a 11 a 100 a 排序的结果是10 a
  • 算法导论学习笔记06——二叉搜索树

    二叉搜索树以二叉树的形式组织数据 xff0c 每个节点除了记录key值和卫星数据 xff08 非key值的数据 xff09 外 xff0c 还需要三个指针 xff1a left xff08 指向左孩子 xff09 right xff08 指
  • Ubuntu 编译安装 php7.4

    安装依赖 sudo apt update sudo apt install gcc y amp amp sudo apt install make y amp amp sudo apt install openssl y amp amp s
  • WSL2 启用systemd

    WSL2 启用systemd 项目 wsl distrod 安装方法 一 1 确保默认的WSL本版为2 wsl set default version 2 2 下载并解压缩 distrod wsl launcher xff0c 解压提取ex
  • WSL2安装k8s

    WSL2启用systemd 参考这个方法 xff1a https blog csdn net hiqiming article details 125111806 spm 61 1001 2014 3001 5501 关闭swap 在当前W
  • VMware中 CentOS7网络配置

    1 检测网络是否可用 gt Ping 114 114 114 114 注意 xff1a 不要通过ping www baidu com等网站来进行测试 2 VMWare安装后的5个服务 xff08 1 xff09 Authorization
  • 数据结构学习笔记——栈

    栈 栈栈的顺序存储结构及其基本运算实现顺序栈4要素基于顺序栈的基本运算共享栈共享栈的4要素 栈的链式存储结构及其基本运算实现链栈4要素基于链栈的基本运算 栈 栈的顺序存储结构及其基本运算实现 顺序栈 4要素 基于顺序栈的基本运算 共享栈 共
  • BUG List

    BUG List 人类从历史中学到的唯一教训 xff0c 就是人类无法从历史中学到任何教训 黑格尔 Linux 常见 gedit bashrc bashrc是home目录下的一个shell文件 xff0c 用于储存用户的个性化设置 在bas
  • 为什么区间要写成左闭右开?

  • SUSE服务器上安装R语言

    参考 xff1a http blog sina com cn s blog 6caea8bf0100zfbu html 1 解压文件 xff1a tar zvxf R 2 13 2 tar gz 2 进入R源文件目录 xff1a cd R
  • n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始(18)

    第18题 xff1a 题目 xff1a n个数字 xff08 0 1 n 1 xff09 形成一个圆圈 xff0c 从数字0开始 xff0c 每次从这个圆圈中删除第m个数字 xff08 第一个为当前数字本身 xff0c 第二个为当前数字的下
  • 最大公约数算法——欧几里德算法

    欧几里德算法又称辗转相除法 xff0c 用于计算两个整数m和n 0 m lt n 的最大公约数 xff0c 记为gcd m n 其计算过程是重复应用下列等式 xff0c 直到n mod m 61 0 gcd m n 61 gcd n mod
  • 安装显卡驱动时遇到The CC version check failed问题解决方法

    在Ubuntu上安装显卡驱动时报以下错误 xff1a The CC version check failed The kernel was built with gcc version 5 4 0 20160609 Ubuntu 5 4 0
  • 几款免费好用的OCR工具

    相信经常看书的同学会有想把书里面的图片转成文字的需求 xff0c 搜集了下最近尝试的在Mac能用的OCR工具 xff0c 汇总出来 1 Microsoft Onenote 实在是找不到那个右键 gt copy as text 2 Googl

随机推荐

  • 洛谷 P1591 阶乘数码

    P1591 阶乘数码 题目描述 求n 中某个数码出现的次数 输入输出格式 输入格式 xff1a 第一行为t 10 xff0c 表示数据组数 接下来t行 xff0c 每行一个正整数n 1000 和数码a 输出格式 xff1a 对于每组数据 x
  • 洛谷 P2633 Count on a tree

    P2633 Count on a tree 题目描述 给定一棵N个节点的树 xff0c 每个点有一个权值 xff0c 对于M个询问 u v k xff0c 你需要回答u xor lastans和v这两个节点间第K小的点权 其中lastans
  • 洛谷 P3383 【模板】线性筛素数

    P3383 模板 线性筛素数 题目描述 如题 xff0c 给定一个范围N xff0c 你需要处理M个某数字是否为质数的询问 xff08 每个数字均在范围1 N内 xff09 输入输出格式 输入格式 xff1a 第一行包含两个正整数N M x
  • VirtualBox在win10下安装一个manjaro linux操作系统的教程

    本篇文章主要分享linux系统中界面比较精美清爽的操作系统manjaro xff0c 很适合使用win系统的程序员在虚拟机中安装 xff0c 方便工作中使用 linux操作系统的特点 xff1a 可畅快舒服的使用linux的命令语句 使用软
  • Python一直报错:SyntaxError: invalid syntax 的原因及解决办法

    本篇文章主要讲解 python报错提示 无效语法 SyntaxError invalid syntax 的原因及解决办法 日期 2022年2月18日 作者 任聪聪 报错现象 python报错如下 但是没有发现那里不对 造成报错的原因汇总 如
  • 打包pyinstaller生成的python桌面应用为windows安装包的方法教程

    本篇文章主要讲解使用nsis制作windows安装包的方法 日期 xff1a 2022年12月7日 作者 xff1a 任聪聪 一 准备材料 1 nsis软件 nsis是一款生成windows安装包的一款压缩工具 下载地址 xff1a htt
  • linux常用命令

    常用命令 编号操作命令1复制文件 1cp r home web service test canlian chengxu dbfile app properties 2 home web service test canlian cheng
  • 002-HTML入门

    1 什么是HTML HTML 是用来描述网页的一种语言 HTML 指的是超文本标记语言 Hyper Text Markup Language HTML 不是一种编程语言 xff0c 而是一种标记语言 markup language 标记语言
  • Debian linux--从安装到升级(非编译)

    debian 完美桌面应用 Debian linux 从安装到升级 在windows底下 xff0c 我们尝尽了欢乐与痛苦 xff1a 办公 笔记本预装了windows xff0c 为什么不预装office xff1f 游戏 最爱当然是3D
  • linuxshell如何实现进度条效果

    代码如下 xff1a b 61 39 39 for i 61 0 i lt 61 100 i 43 61 2 do printf 34 PleaseWait 50s d r 34 b i sleep 3 b 61 34 gt 34 b do
  • XDMCP服务器

    导读 xff1a 几个人同时有x windows时 X server xff1a 主要是负责显示 x client xff1a 主要是负表运算 设定XDMCP XDM是X Display Manager的简称 功能就是管理操控xserver
  • Laravel中间件向Controller传递值

    Laravel中间件向Controller传递值 方法一 span class token keyword class span MidParams span class token comment 中间件 span span class
  • 3. Proxmox VE 配置 NTP

    3 Proxmox VE配置 NTP 手动 span class token comment apt y install ntp span span class token comment vi etc ntp conf span span
  • 4. 在 Proxmox VE 安装Ceph

    4 在 Proxmox VE 安装 Ceph 1 安装 按图操作即可 2 参考 1 https blog csdn net ggeol article details 109112815
  • 5. 在 Proxmox VE 配置Ceph

    Pool 用于存储虚拟机的img xff0c 如果需要实现虚拟机的HA xff0c 那么虚拟机必须创建在Ceph上 xff0c 通过Ceph的多副本来实现故障恢复 CephFS 在PVE中主要用于共享文件 xff0c 如iso文件等 创建O
  • 6. Proxmox VE安装Ceph Dashboard

    6 Proxmox VE安装Ceph Dashboard span class token function apt get span span class token function install span ceph mgr dash
  • 7.安装Proxmox Backup Server

    安装Proxmox Backup Server 1 安装 安装和Proxmox VE基本是一样的 xff0c 看图一直下一步即可 安装完成会自动重启 xff0c 重启后如下图 2 参考 1 https pbs proxmox com wik
  • 8. 添加Backup Server到PVE集群

    添加Backup Server到PVE集群 1 配置磁盘 2 配置账户 3 PVE中添加 Backup Server
  • 在Harvester上安装windows sever 2012 r2

    安装Windows Server 2012 r2 文章目录 安装Windows Server 2012 r2新建虚拟机配置基础信息配置卷配置网络开机 xff0c 进入安装系统步骤安装磁盘驱动安装网络驱动安装其他驱动测试网络 Harveste
  • SDU 程序设计思维实践 第四周 csp模拟

    文章目录 题目A 咕咕东的奇遇题意InputOutput 思路总结代码 题目B 咕咕东想吃饭题意InputOutput 思路总结代码 题目C 可怕的宇宙射线题意InputOutput 思路总结代码 题目A 咕咕东的奇遇 题意 咕咕东是个贪玩