ecjtu-2020训练赛(1)解题报告

A题 CF1382A Common Subsequence

题意
给出两个数字个数分别为n,m的整数数组a,b。 你需要找出一个最短的整数数组c使得它同时是a,b的子序列。如果可以,请输出"YES",并输出c的数字个数及整个c数组;否则,输出"NO"。

思路:
要求a和b的公共最短子序列,如果有的话最短肯定是1,所以可以对b数组的元素遍历,在a中寻找有没有相同的元素,如果有那这个相同元素就是c,直接输出即可,全部遍历完还没有找到一个那就是NO。

B题 Sequential Nim

题意:
有n堆石子,第i堆有ai个。有两个人在玩取石子游戏。
两个人轮流取石子,每次取编号最小且有石子的堆。每个人可以在一堆石子中取走若干个(至少取1个),当一个人没有石子可以取了,他就输了。
现在给出每堆石子的数量,假设两人的都采用最优策略,问最后是先手(first)胜利还是后手(second)胜利。

思路:
咋一看很像是尼母博弈,但其实他只能从左到右的取石头。就拿1 2 3 4 5 6这个例子来看,如果我是先手,你是后手,我第一步只能拿第一堆的一个,然后你的每次操作都是拿的这一堆只剩1个石头,逼得我每次只能拿这堆中的最后一个,十分被动。到了倒数第二堆的时候,你拿了4个我只能拿一个,然后你拿最后一堆的6个你就赢了。

但是如果中间的某一堆中只有一个会不会改变主动者呢?
看1 2 1 2 2这个例子,我先拿一个,你看到第三堆只有一个,那你肯定是把第二堆两个全拿走,然后我又是被动的只能拿第三堆的唯一一个,你的主动权没有丢失,所以答案是否定的。

所以主动的人一定是赢的,而最先拿非1石头的新的一堆的人就是主动者,如果从左到右有很多个1,那就相当于在更换主动权,而且是同时被迫更换主动权,那思考一下就知道,如果左边有奇数个连续的1,那主动权在第二个人,偶数个则相反。(还要考虑一下如果到了最后一堆的话就没有主动不主动了,全部拿完就赢了,所以连续的1的个数所考虑的范围在0~n-2)

C题 CF1385A Three Pairwise Maximums

题意:
给你三个正整数x,y,z。你需要找到三个正整数a,b,c,使得x=max(a,b),y=max(a,c),z=max(b,c)。

思路:
我的思路比较死,就是找规律,如果数学比较好的其实可以推出来一定会有两个值是相等的才能找到abc,而且相等的两个值一定>=另一个值。
我自己的是这样写的:
在这里插入图片描述

D题 CF1385B Restore the Permutation by Merger

题意:
给定一个长度为2n的数组a,求长度为n的数组p满足p中的数为1~n(不重复),且数组a可以由两个数组p组合得到。
这里两个数组组合指的是第二个数组的每个元素按顺序插入第一个数组的任意空中。例如两个p=[3,1,2]可以组合成[3,1,2,3,1,2],[3,3,1,1,2,2],[3,1,3,1,2,2],但不能组合成[1,3,2,1,2,3],[3,1,2,3,2,1],[3,3,1,2,2,1]。
给定n和长度为2n的数组a,求满足要求的数组p,保证唯一解。
思路:
两个相同的数组,保证元素相对位置不变随便插入后合并两个数组得到a,而且p是没有重复数字的,那就是说遍历数组a,我遇到了前面已经有了的数字我就不管它,如果前面没有那我就加入到vector中(我个人比较喜欢用vector储存结果数组),那最后vector中的数字就是p。

E题 CF1388A Captain Flint and Crew Recruitment

题意:
如果一个正整数能写成两个不同质数的积,那么我们称它为类质数。
给定一个自然数 n,请问是否能将 n 写成四个互不相同的正整数的,并满足这四个正整数中至少有三个是类质数。如果能,请给出一种方案。
思路:
看到类质数这个概念一般都会先列出几个类质数出来看看,我就先列了一下质数2 3 5 7… ,然后类质数6 10 14 15 21 35… ,他既然说至少有三个,那取前三个类质数6 10 14,求和是30,如果n<=30那肯定找不到一个可行的方案,大于30的话就取这前三个,最后一个是n-30,加起来一定就是n了,但4个数要互不相同,那就不能出现6 6 10 14,6 10 10 14,6 10 14 14这三个情况,这三个特别的寻找一下可行的方案就行了,其他的都可以用6 10 14 n-30这个方案。

F题 CF1388B Captain Flint and a Long Voyage

题意
若有一个n位正整数c,定义k的值为将c的每一位上的数字转换为二进制(不含前导0)。比如=729时,k=111101001。将k的后n位截去得到r。比如=729时,r=111101.
现在给定n,你需要找到r最大时c的最小值。

思路
首先看题目后知道,r得先要满足最大这个条件,所以先其他的别管,把r最大的情况先找出来,r是一个二进制数,当然位数越多越大,对于单数来数,7的二进制是111,8的二进制是1000,9的二进制是1001,当然在8和9里面取才能使r最大(注意一下都是4位)。
那满足了r最大就可以考虑c最小了。想要c最小其实只能尽可能的在末尾多取8,因为在截去n位的时候,这n位是什么都无所谓,反正最后都得没,那就让这n位里面的数尽量小就行了(其实最小也就是8),至于8的个数,那肯定和4有关,毕竟8和9的二进制都是4位。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值