2020年CSP-S第二轮比赛分析

儒略日(julian)

【题目描述】
为了简便计算,天文学家们使用儒略日(Julian day)来表达时间。所谓儒略日,其定义为从公元前 4713年 1月 1日正午 12点到此后某一时刻间所经过数,不满一天者用小数表达。若利用这一天文学历法,则每一个时刻都将被均匀的映射到数轴上,从而得以很方便的计算它们的差值。

现在,给定一个不含小数部分的儒略日,请你帮忙计算出该儒略日(一定是某一天的中午 12点)所对应的公历日期。
我们现行的公历为格里高利历(Gregoriancalendar),它是在公元1582年由教皇格里高利十三世在原有的儒略历(Juliancalendar)的基础上修改得到的(注:儒略历与儒略日并无直接关系)。具体而言,现行的公历日期按照以下规则计算:
公元 1582年 10月 15日(含)以后:适用格里高利历,每年一月 31天、二月 28天或 29天、三月 31天、四月 30天、五月 31天、六月 30天、七月 31天、八月 31天、九月 30天、十月 31天、十一月 30天、十二月 31 天。其中,闰年的二月为 29天,平年为 28天。当年份是 400的倍数,或日期年份是 4的倍数但不是 100的倍数时,该年为闰年。
公元1582年10月5日(含)至10月14日(含):不存在,这些日期被删除,该年 10月 4日之后为 10月 15日。

公元 1582年 10月 4日(含)以前:适用儒略历,每月天数与格里高利历相同,但只要年份是 4的倍数就是闰年。

尽管儒略历于公元前 45年才开始实行,且初期经过若干次调整,但今天人类习惯于按照儒略历最终的规则反推一切 1582年 10月 4日之前的时间。注意,公元零年并不存在,即公元前 1年的下一年是公元 1年。因此公元前 1年、前 5年、前 9年、前 13年……以此类推的年份应视为闰年。

【输入格式】
输入文件名为 julian.in。
第一行一个整数 𝑄,表示询问的组数。
接下来 𝑄 行,每行一个非负整数 𝑟𝑖 ,表示一个儒略日。
【输出格式】
输出文件名为 julian.out。
对于每一个儒略日 𝑟𝑖 ,输出一行表示日期的字符串 𝑠𝑖。共计 𝑄 行。
𝑠𝑖 的格式如下:
若年份为公元后,输出格式为DayMonth Year。其中日(Day)、月(Month)、年(Year)均不含前导零,中间用一个空格隔开。例如:公元2020 年 11 月 7 日正午 12 点,输出为 7 11 2020。
若年份为公元前,输出格式为 DayMonthYearBC。其中年(Year)输出该年份的数值,其余与公元后相同。例如:公元前 841年 2月 1日正午 12点,输出为 1 2 841 BC。
【数据范围与提示】
在这里插入图片描述

分析

这道题很复杂,考试时用了1个多小时也没写出来

动物园(zoo)

【题目描述】
动物园里饲养了很多动物,饲养员小 A 会根据饲养动物的情况,按照《饲养指南》购买不同种类的饲料,并将购买清单发给采购员小 B。

具体而言,动物世界里存在 2𝑘 种不同的动物,它们被编号为 0 ∼ 2𝑘 − 1。动物园里饲养了其中的 𝑛 种,其中第 𝑖 种动物的编号为 𝑎𝑖。

《饲养指南》中共有 𝑚 条要求,第 𝑗 条要求形如“如果动物园中饲养着某种动物,满足其编号的二进制表示的第 𝑝𝑗 位为 1,则必须购买第 𝑞𝑗 种饲料”。其中饲料共有 𝑐 种,它们从 1 ∼ 𝑐 编号。本题中我们将动物编号的二进制表示视为一个 𝑘 位 01 串,第 0 位是最低位,第 𝑘 − 1 位是最高位。

根据《饲养指南》,小 A 将会制定饲料清单交给小 B,由小 B 购买饲料。清单形如一个 𝑐 位 01 串,第 𝑖 位为 1 时,表示需要购买第 𝑖 种饲料;第 𝑖 位为 0 时,表示不需要购买第 𝑖 种饲料。

实际上根据购买到的饲料,动物园可能可以饲养更多的动物。更具体地, 如果将当前未被饲养的编号为 𝑥的动物加入动物园饲养后,饲料清单没有变化,那么我们认为动物园当前还能饲养编号为 𝑥的动物。

现在小 B 想请你帮忙算算,动物园目前还能饲养多少种动物。

【输入格式】
输入文件名为zoo.in。

第一行包含四个以空格分隔的整数 𝑛、𝑚、𝑐、𝑘。分别表示动物园中动物数量、《饲养指南》要求数、饲料种数与动物编号的二进制表示位数。

第二行 𝑛个以空格分隔的整数,其中第 𝑖 个整数表示 𝑎𝑖。

接下来 𝑚行,每行两个整数 𝑝𝑖,𝑞𝑖表示一条要求。

数据保证所有 𝑎𝑖 互不相同,所有的 𝑞𝑖 互不相同。

【输出格式】
输出文件名为zoo.out。

仅一行一个整数表示答案。

【数据范围与提示】
对于 20%的数据:𝑘 ≤ 𝑛 ≤ 5,𝑚 ≤ 10,𝑐 ≤ 10,所有的 𝑝𝑖 互不相同。

对于 40%的数据:𝑛 ≤ 15,𝑘 ≤ 20,𝑚 ≤ 20,𝑐 ≤ 20。

对于 60%的数据:𝑛 ≤ 30,𝑘 ≤ 30,𝑚 ≤ 1000。

对于 100%的数据:0 ≤ 𝑛, 𝑚 ≤ 106,0 ≤ 𝑘 ≤ 64,1 ≤ 𝑐 ≤ 108。

分析

答案为2的(满足(动物园已有的某动物编号的二进制这一位为1或《饲养指南》对这一位没有要求)的位数)次方-n。

函数调用(call)

【题目描述】
函数是各种编程语言中一项重要的概念,借助函数,我们总可以将复杂的 任务分解成一个个相对简单的子任务,直到细化为十分简单的基础操作,从而使代码的组织更加严密、更加有条理。然而,过多的函数调用也会导致额外的开销,影响程序的运行效率。

某数据库应用程序提供了若干函数用以维护数据。已知这些函数的功能可分为三类:

将数据中的指定元素加上一个值;

将数据中的每一个元素乘以一个相同值;

依次执行若干次函数调用,保证不会出现递归(即不会直接或间接地调用本身)。

在使用该数据库应用时,用户可一次性输入要调用的函数序列(一个函数可能被调用多次),在依次执行完序列中的函数后,系统中的数据被加以更新。某一天,小 A在应用该数据库程序处理数据时遇到了困难:由于频繁而低效的函数调用,系统在执行操作时进入了无响应的状态,他只好强制结束了数据库程序。为了计算出正确数据,小A 查阅了软件的文档,了解到每个函数的具体功能信息,现在他想请你根据这些信息帮他计算出更新后的数据应该是多少。

【输入格式】
输入文件名为call.in。

第 1 行一个正整数 𝑛,表示数据的个数。

第 2 行 𝑛 个整数,第 𝑖 个整数表示下标为 𝑖 的数据的初始值为 𝑎𝑖。

第 3 行一个正整数 𝑚,表示数据库应用程序提供的函数个数。函数从 1 ∼𝑚 编号。

接下来 𝑚 行中,第 𝑗(1 ≤ 𝑗 ≤ 𝑚)行的第一个整数为 𝑇𝑗 ,表示 𝑗 号函数的类型:

若 𝑇𝑗 = 1,接下来两个整数 𝑃𝑗 , 𝑉𝑗 分别表示要执行加法的元素的下标及其增加的值;

若 𝑇𝑗 = 2,接下来一个整数 𝑉𝑗 表示所有元素所乘的值;

若 𝑇𝑗 = 3,接下来一个正整数 𝐶𝑗 表示 𝑗号函数要调用的函数个数,

随后C𝑗 个整数𝑔1(j), 𝑔2(j),…, 𝑔cj(j)依次表示其所调用的函数的编号。

第 𝑚 + 4 行一个正整数 𝑄,表示输入的函数操作序列长度。

第 𝑚 + 5 行 𝑄 个整数 𝑓𝑖 ,第 𝑖 个整数表示第 𝑖 个执行的函数的编号。

【输出格式】

输出文件名为call.out。

一行 𝑛 个用空格隔开的整数,按照下标 1 ∼ 𝑛 的顺序,分别输出在执行完输入的函数序列后,数据库中每一个元素的值。答案对 998244353 取模。

【数据范围与提示】
在这里插入图片描述
对于所有数据:0 ≤ 𝑎𝑖 ≤ 104,𝑇𝑗 ∈ {1,2,3},1 ≤ 𝑃𝑗 ≤ 𝑛,0 ≤ 𝑉𝑗 ≤ 104,1 ≤ 𝑔k(𝑗) ≤𝑚,1≤𝑓𝑖≤𝑚。

分析

用暴力得了20分。

贪吃蛇(snakes)

【题目描述】
草原上有 𝑛 条蛇,编号分别为 1,2, ⋯ , 𝑛。初始时每条蛇有一个体力值𝑎𝑖,我们称编号为 𝑥 的蛇实力比编号为 𝑦 的蛇强当且仅当它们当前的体力值满足 𝑎𝑥 > 𝑎𝑦,或者 𝑎𝑥 = 𝑎𝑦 且 𝑥 > 𝑦。

接下来这些蛇将进行决斗,决斗将持续若干轮,每一轮实力最强的蛇拥有选择权,可以选择吃或者不吃掉实力最弱的蛇:

如果选择吃,那么实力最强的蛇的体力值将减去实力最弱的蛇的体力值,实力最弱的蛇被吃掉,退出接下来的决斗。之后开始下一轮决斗。

如果选择不吃,决斗立刻结束。

每条蛇希望在自己不被吃的前提下在决斗中尽可能多吃别的蛇(显然,蛇 不会选择吃自己)。

现在假设每条蛇都足够聪明,请你求出决斗结束后会剩几条蛇。

本题有多组数据,对于第一组数据,每条蛇体力会全部由输入给出,之后的每一组数据,会相对于上一组的数据,修改一部分蛇的体力作为新的输入。

【输入格式】
输入文件名为snakes.in。

第一行一个正整数 𝑇,表示数据组数。

接下来有 𝑇 组数据,对于第 1 组数据,第一行一个正整数 𝑛,第二行 𝑛个非负整数表示𝑎𝑖。

对于第 2 组到第 𝑇 组数据,每组数据:

第一行第一个非负整数 𝑘 表示体力修改的蛇的个数。

第二行 2𝑘 个整数,每两个整数组成一个二元组 (𝑥, 𝑦),表示依次将 𝑎𝑥的值改为 𝑦。一个位置可能被修改多次,以最后一次修改为准。

【输出格式】
输入文件名为snakes.out。

输出 𝑇 行,每行一个整数表示最终存活的蛇的条数。

【数据范围与提示】
对于 20%的数据:𝑛 = 3。

对于 40%的数据:𝑛 ≤ 10。

对于 55%的数据:𝑛 ≤ 2000。

对于 70%的数据:𝑛 ≤ 5 × 104。

对于 100%的数据:3 ≤ 𝑛 ≤ 106,1 ≤ 𝑇 ≤ 10,0 ≤ 𝑘 ≤ 105,0 ≤ 𝑎𝑖 , 𝑦 ≤ 109。保证每组数据(包括所有修改完成后的)的 𝑎𝑖 以不降顺序排列。

分析

我的算法:如果体力值最大的蛇吃掉体力值最小的蛇不会被吃掉,就不停地吃。但不够时间打代码,得0分。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值