【CSDN竞赛第17期】简要题解 92.5分

2023-11-12

1.判断胜负(简单字符串)

题目

已知两个字符串A,B。 连续进行读入n次。 每次读入的字符串都为A|B(笔者注:意思是要么是A,要么是B)。 输出读入次数最多的字符串。

题解

比赛时想复杂了,记录每个字符串出现的次数,结果次数多的就是答案。
其实只需要记录第1个字符串,之后的字符串相同则计数+1,不同则记下字符串。计数大于n/2就输出第1个字符串,否则输出另一个字符串。

比赛时代码

其实有bug,每次A或B,可能只出现A或只出现B,代码会panic。实际数据没这种情况。

package main

import "fmt"

func solution(n int, arr []string) {
	// TODO: 请在此编写代码
	mp := make(map[string]int)
	for _, s := range arr {
		mp[s]++
	}
	if len(mp) != 2 {
		panic(len(mp))
	}
	var s1, s2 string
	var v1, v2 int
	for s, v := range mp {
		if s1 == "" {
			s1, v1 = s, v
		} else {
			s2, v2 = s, v
		}
	}
	if v1 < v2 {
		s1 = s2
	}
	if v1 == v2 {
		fmt.Println("dogfall")
	} else {
		fmt.Println(s1)
	}
}
func main() {
	var n int
	fmt.Scan(&n)
	arr := make([]string, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&arr[i])
	}
	solution(n, arr)
}

2.买铅笔(简单算数)

题目

P老师需要去商店买n支铅笔作为小朋友们参加编程比赛的礼物。她发现商店一共有 3 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。
为了公平起 见,P老师决定只买同一种包装的铅笔。 商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过 n 支铅笔才够给小朋 友们发礼物。
现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 n 支铅笔最少需要花费多少钱。

题解

相当于要求在“包数乘每包铅笔数大于等于要求铅笔数”的情况下,“包数乘每包价格数”最低。

意味着算需要的包数需要上取整。

代码

package main

import "fmt"

func solution(n int, arr [3][2]int) {
	// TODO: 请在此编写代码
	ans := -1
	//ans := (n+arr[0][0]-1)/arr[0][0]*arr[0][1]
	for i := range arr {
		if ans == -1 || ans > (n+arr[i][0]-1)/arr[i][0]*arr[i][1] {
			ans = (n + arr[i][0] - 1) / arr[i][0] * arr[i][1]
		}
	}
	fmt.Println(ans)
}
func main() {
	var n int
	var arr [3][2]int
	fmt.Scan(&n)
	for i := 0; i < 3; i++ {
		for j := 0; j < 2; j++ {
			fmt.Scan(&arr[i][j])
		}
	}
	solution(n, arr)
}

3.拯救爱情(得分70%)

题目

小艺酱走到一个花之占卜店中。 店员小Q看到小艺酱可怜的样子,允许小艺酱免费占卜一次。
花瓣占卜:

  1. 一瓣“在一起”,一瓣“不在一起”;开始的花瓣表示“在一起”。
  2. 直到最后一个花瓣落地游戏结束。
  3. 可以选择多朵花,选择撕一朵花就必须撕完。

以下为笔者补充大意(比赛时有,但《考试报告》中没有):
最终结果为“在一起”。

题解

没看明白题意……
我的理解:n朵花,每朵花有0个、1个或多个花瓣,选若干朵花,总花瓣数为奇数。

奇数花瓣的花的个数为奇数,全选;偶数个,不选最小的那个奇数。

比赛时代码

package main

import "fmt"
import "sort"

func solution(n int, a []int) {
	// TODO: 请在此编写代码
	ji := []int{}
	ou := []int{}
	sum := int64(0)
	for _, v := range a {
		sum += int64(v)
		if v%2 == 0 {
			ou = append(ou, v)
		} else {
			ji = append(ji, v)
		}
	}
	sort.Ints(ou)
	sort.Ints(ji)
	if len(ji)%2 == 1 {
		fmt.Println(sum)
	} else {
		if len(ji) != 0 {
			fmt.Println(sum - int64(ji[0]))
		} else {
			//fmt.Println("")
			//fmt.Println("0")
			//fmt.Println("no")
			//fmt.Println("NO")
			//fmt.Println(-1)
			/*ans := 0
			  for _, v := range ou{
			  if v!=0{
			  break
			  }
			  ans++
			  }
			  fmt.Println(ans)*/
		}
	}
}
func main() {
	var n int
	fmt.Scan(&n)
	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&a[i])
	}
	solution(n, a)
}

4.拯救公主(中国剩余定理 或 模拟)

题目

在Flower Kingdom里,住着一位美丽的公主Ana,有一天Ana得了一种怪病,神医告知国王,在遥远的幽谷中有一种药能治愈Ana, 但是神医只有一份不完整的地图,地图的描述如下:

该地图的共有3行,第一行有m列,m为奇数,第二行有m+1列,第三行有m+2列;每一行用一个字符串表示,只有【两种字符】;‘.'表示草地,可以从它上面通过,‘*’表示岩石,每一行 最多 一个‘*’; 入口在左上角,由于在对角线方向上,因此即使对角线两边都有岩石,但是缝隙较大,人可以通过,故人可以向八个方向行走;

真实地图是由该地图的【每一行无限循环】得到的,这种神奇的药草就生长在第x行第y列的草地上,药草可能会在岩石上;

国王决定派遣勇敢的骑士David前去寻找拯救公主的解药; 现在聪明的你是否知道David能否找到该药?

以下为笔者补充大意:
t组数据,范围大概是m<=1000, t<=10
m>1
y的范围应该是1e8,记不清了。
比如输入数据是

..
.*.
..*.

代表的图是(无限列)

........................
.*..*..*..*..*..*..*..*.
..*...*...*...*...*...*.

题解

如果有1列中3行均是岩石,形成一列岩石,会把路挡住,让骑士无法向右走,导致取不到草药。

首先考虑药草不能在岩石上,否则直接返回NO。

其次,如果3行中至少1行没岩石,路不可能被挡住,返回YES。

否则,意味着药草不在岩石上,且3行均有岩石。
答案即判断图中是否存在一列岩石,如果存在是否在药草左侧(挡住路)。

假设岩石列号为p1,p2,p3,所有岩石位置为

(1, p1) (1, p1+1*m) (1, p1+2*m) ……
(2, p2) (2, p2+1*(m+1)) (2, p2+2*(m+1)) ……
(3, p3) (3, p3+1*(m+2)) (3, p3+2*(m+2)) ……

模拟

从左到右枚举每行岩石的位置,每次右移当前最左列的岩石。。
比如一开始是(1, p1) (2, p2) (3, p3),第一步:
如果p1<=p2且p1<=p3,就将当前考虑位置变为(1, p1+m) (2, p2) (3, p3)
如果p2<=p1且p2<=p3,就将当前考虑位置变为(1, p1) (2, p2+(m+1)) (3, p3)
如果p3<=p2且p3<=p1,就将当前考虑位置变为(1, p1) (2, p2) (3, p3+(m+2))
以此类推。
直到min{p1+k1*m, p2+k2*(m+1), p3+k3*(m+2)}>=y 或 p1+k1*m==p2+k2*(m+1)==p3+k3*(m+2)之一成立。
若前者首先成立,意味着药草在最左的一列岩石左侧,不会被挡住。
若后者首先成立,意味着形成了一列岩石,挡住了药草。

中国剩余定理

(笔者不太熟悉数论……)
假设所有一列岩石为第L列,最左一列岩石为第L0列,则有:
L=p1 (mod m)
L=p2 (mod (m+1))
L=p3 (mod (m+2))
用中国剩余定理求,大概是如果m、m+1、m+2不互素,可能无解(?)
否则可以求出满足要求的最小的正数L0,进而有L=L0+k*LCM{ m, m+1, m+2 }
k为非负整数,LCM表示最小公倍数。
比较L0与y,可知骑士先遇到药草还是一列岩石。

比赛时代码

模拟部分是对的,其他部分实际没用到。
因为不会实现中国剩余定理,所以用的扩展欧几里得,有问题,大概能得70分。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

using namespace std;
#define LL long long
#define int long long

LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    LL g = exgcd(b, a % b, x, y);
    LL tmp = y;
    y = x - (a / b) * y;
    x = tmp;
    return g;
}

std::string solution(int m, int x, int y, std::vector<std::string> &vec) {
    if (y <= 1e8) {
        int pos[3] = {-1, -1, -1};
        int sum[3] = {m, m + 1, m + 2};
        for (int i = 0; i < 3; i++) {
            for (int p = 0; p < sum[i]; p++) {
                if (vec[i][p] == '*') {
                    pos[i] = p + 1;
                    break;
                }
            }
        }
        if ((y - pos[x - 1]) % sum[x - 1] == 0) {
            return "NO";
        }
        if (pos[0] == -1 || pos[1] == -1 || pos[2] == -1) {
            return "YES";
        }
        while (true) {
            int minP = 0;
            for (int i = 1; i <= 2; i++)if (pos[i] < pos[minP])minP = i;
            if (pos[minP] >= y) {
                return "YES";
            }
            if (pos[0] == pos[1] && pos[1] == pos[2]) {
                return "NO";
            }
            pos[minP] += sum[minP];
        }
    } else {
        std::string result;
        int pos[3] = {};
        int sum[3] = {m, m + 1, m + 2};
        for (int i = 0; i < 3; i++) {
            for (int p = 0; p < sum[i]; p++) {
                if (vec[i][p] == '*') {
                    pos[i] = p + 1;
                    break;
                }
            }
        }
        if ((y - pos[x - 1]) % sum[x - 1] == 0) {
            return "NO";
        }
        int k0, k1;
        int g01 = exgcd(sum[0], -sum[1], k0, k1);
        if ((pos[1] - pos[0]) % g01 != 0) {
            return "NO";
        }
        k0 *= (pos[1] - pos[0]) / g01;
        k1 *= (pos[1] - pos[0]) / g01;
        int k0_, k2_;
        int g02 = exgcd(sum[0], -sum[2], k0_, k2_);
        if ((pos[2] - pos[0]) % g02 != 0) {
            return "NO";
        }
        k0_ *= (pos[2] - pos[0]) / g02;
        k2_ *= (pos[2] - pos[0]) / g02;
        int d1, d2;
        int gdd = exgcd(sum[1], -sum[2], d1, d2);
        if ((k0_ - k0) % gdd != 0) {
            return "NO";
        }
        d1 *= (k0_ - k0) / gdd;
        d2 *= (k0_ - k0) / gdd;
        //int kk0 = k0+d1*(m+1);
        //int kk1 = k1+d1*m;
        int kk2 = k2_ + d2 * m;
        int pp = pos[0] + kk2 * m;
        int ss = m * (m + 1) * (m + 2);
        if (pp < 1) {
            int f = (1 - pp + ss - 1) / ss;
            pp += f * ss;
        }
        return pp > y ? "YES" : "NO";
    }
    /*int bs0 = (m+1)*(m+2);
    int bs1 = m*(m+2);
    int bs2 = m*(m+1);
    if(kk0<1){
    int f = (1-kk0 + bs0-1) / bs0;
    kk0 += f*bs0;
    kk1 += f*bs1;
    kk2 += f*bs2;
    }
    if(kk1<1){
    int f = (1-kk1 + bs1-1)/bs1;
    kk0 += f*bs0;
    kk1 += f*bs1;
    kk2 += f*bs2;
    }
    if(kk2<1){
    int f = (1-kk2+bs1-1)
    }
    return result;*/
}

#undef int

int main() {
#define int long long
    int T;
    std::cin >> T;
    for (int i = 0; i < T; i++) {
        int m;
        int x;
        int y;
        std::vector<std::string> vec;
        std::cin >> m;
        std::cin >> x;
        std::cin >> y;
        std::string token;
        for (size_t i = 0; i < 3; i++) {
            std::cin >> token;
            vec.push_back((token));
        }
        std::string result = solution(m, x, y, vec);
        std::cout << result << std::endl;
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【CSDN竞赛第17期】简要题解 92.5分 的相关文章

  • Qt信号和槽函数连接不成功原因

    Qt信号和槽连接失败原因主要有以下几点 1 槽函数并没有声明在类的public slots 或private slots或protected slots 里 因此 所想要成为槽函数的那个函数只是普普通通成员函数 2 信号和槽之间存在参数传递
  • Ajax获取图片的两种方式

    在Web项目中 我们可能遇到需要利用Ajax来获取图片的情况 因为客户端处理的是图片文件的二进制流 所以可利用Blob和File API来将图片转为URL 赋值给img的src属性来解决这个问题 本文总结Ajax获取图片的两种方式 即针对X
  • Java 调用Matlab画图实用教程

    本文主要讲述使用Java程序调用Matlab画图的步骤 1 编写Matlab绘图程序 function drawzhexiantu x y 绘图 plot x real y real b 线性 颜色 标记 设置标题 title ceshil

随机推荐

  • IOCTL_STORAGE_PROPERTY_QUERY

    Thanks I also find some thing 1 use drive letter use createfile2 use IOCTL STORAGE PROPERTY QUERY query some property of
  • 华为OD机试真题-数组拼接-2023年OD统一考试(B卷)

    题目描述 现在有多组整数数组 需要将它们合并成一个新的数组 合并规则 从每个数组里按顺序取出固定长度的内容合并到新的数组中 取完的内容会删除掉 如果该行不足固定长度或者已经为空 则直接取出剩余部分的内容放到新的数组中 继续下一行 输入描述
  • JUC并发编程学习

    JUC并发编程学习 目录 JUC并发编程学习 1 什么是JUC 1 1 JUC简介 1 2 进程与线程 1 3 线程的状态 1 3 1 线程状态Thread State 枚举类 1 3 2 wait sleep 区别 1 4 并发与并行 1
  • PMP到期后自助登录pmi网站续费证书的详细教程

    本篇文章主要讲解新版本的pmp官网续费证书的详细步骤教程 主要为续费操作 日期 2023年8月3日 作者 任聪聪 步骤一 打开pmi官网 步骤二 登录pmi官网 步骤三 在个人中心中点击右上角 弹出如下菜单找到证书按钮 步骤四 进入到证书界
  • Java基础之Scanner类和switch-case结构

    一 Scanner 从键盘获取不同类型的变量需要使用Scanner类 具体步骤 导包 IDEA会自动导包 import java util Scanner Scanner的实例化 调用Scanner相关方法来获取指定变量 import ja
  • git系列之-彻底搞清楚git clone与git pull

    1 git clone git clone顾名思义就是将其他仓库克隆到本地 包括被clone仓库的版本变化 举个例子 你当前目录比方说是在f code 中 此时若想下载远程仓库 本地无需git init 直接git clone url ur
  • 封校大学生无聊玩起图像大找茬——游戏脚本(一起领略Python脚本的风采吧)

    一个帅气的boy 你可以叫我Love And Program 个人主页 Love And Program的个人主页 如果对你有帮助的话希望三连 支持一下博主 图像大找茬 游戏脚本项目地址 图像大找茬 前言 基础知识 图片找茬 抓取句柄图片
  • Python爬虫:百度数据轻松抓取!

    百度是全球最大的中文搜索引擎 每天都有海量的数据被用户输入和查询 这些数据蕴含着巨大的商业价值 作为一名数据分析师或者算法工程师 如何利用这些数据来提升工作效率和商业竞争力呢 这时候 我们需要一种叫做 爬虫 的技术手段来帮助我们 本文将介绍
  • 关于vuepress打包之后页面样式丢失问题两种解决方案

    问题描述 最近打算使用vuepress为公司项目集成一下前端开发文档 在打包的时候遇到了样式丢失的问题 在网络上参考了一些解决方案 记录一下自己遇到的问题 有什么不足的地方多多指教 集成打包之后 打开入口文件展示页面如下 在本地直接运行的页
  • Java项目:眼镜商城系统(java+SSM+JSP+jQuery+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 管理员角色包含以下功能 管理员登录 管理员管理 管理商城会员 新闻公告管理 眼睛类型管理 城市信息管理 连锁配镜店管理 眼镜商品管理 用户订单管理 管理用户的评价信息等功能 用户角色包含以下功
  • 蓝桥杯2013年第四届真题-公式求值

    题目描述 输入n m k 输出下面公式的值 其中C n m是组合数 表示在n个人的集合中选出m个人组成一个集合的方案数 组合数的计算公式如下 输入格式 输入的第一行包含一个整数n 第二行包含一个整数m 第三行包含一个整数k 数据规模和约定
  • 通过H5(浏览器/WebView/其他)唤起本地app

    前两天接到一个无线的需求 我这个小白可是忙活了好几天 在页面上有一个连接 如果用户安装了APP 则点击打开对应的APP如果用户没有安装 则点击打开对应的设置连接 上网搜索了一下 基本都说可以实现 但是实际情况却不乐观 当然只是其中的一个需求
  • Http的body变空格的问题解决方案

    最近在做iOS的内购功能 需要把内购的凭证转化为base64传给服务器 服务器再去AppStore的接口进行二次验证 这中间有一个问题是base64编码的字符串里有 号 这样的字符 传到服务器上 号 字符就变成空格字符了 原因是我们在进行h
  • 建设数据仓库的八个步骤

    摘要 建立数据仓库是一个解决企业问题的过程 业务人员往往不懂如何建立和使用数据仓库 发挥其决策支持的作用 信息部门的人员往往又不懂业务 不知道应该建立哪些决策主题 关键词 数据仓库 元数据 建设数据仓库 建立数据仓库是一个解决企业问题的过程
  • Windows下搭建FTP服务器

    一 什么是ftp FTP 是File Transfer Protocol 文件传输协议 的英文简称 而中文简称为 文传协议 用于Internet上的控制文件的双向传输 同时 它也是一个应用程序 Application 基于不同的操作系统有不
  • 课程笔记1

    一 密码学原理 1 密码学中的哈希函数被称为cryptographic hash function 它具有三点性质 1 哈希碰撞 collision resistance 对于不相等的x和y 对应的哈希值H x H y 没有有效的办法人为地
  • VMWare Fusion虚拟机安装与配置教程

    很多时候 我们都有用虚拟机的需求 比如用着Mac突然有一个软件只支持Windows 并且还需要与macOS上的软件搭配使用 况且你没有Windows电脑 这个时候虚拟机就能帮上大忙 在macOS上 笔者用的是MacBook Air 所以这里
  • 刷脸支付不需要媒介将进一步推动消费升级

    从现金 银行卡 到现在的手机支付移动支付 支付媒介不断发生变化 并最终以手机这样的通用媒介代替了现金 银行卡这样的专用媒介 同时也是一个逐渐脱媒的过程 现在支付宝主推的刷脸支付则相当于在用户端完全不再需要媒介 这也将进一步推动消费升级 4月
  • Vue中如何定义一个全局变量(Trick)

    img class lazyload lazybanner 页面中图片使用懒加载 默认图片想通过全局变量实现 实现方案 Vue filter default img function str return 你的图片路径 img class
  • 【CSDN竞赛第17期】简要题解 92.5分

    目录 1 判断胜负 简单字符串 题目 题解 比赛时代码 2 买铅笔 简单算数 题目 题解 代码 3 拯救爱情 得分70 题目 题解 比赛时代码 4 拯救公主 中国剩余定理 或 模拟 题目 题解 模拟 中国剩余定理 比赛时代码 1 判断胜负