2023 Robocom 游记+题解

Robocom赛前一天熬夜打了一场edu,全程眯眯眼,三题滚粗了,前三题花了一小时才写完,第四题写了一小时也没写明白,好像预示着Robocom的结局?

早上七点醒了,感觉自己浑身无力,想睡觉但是又睡不着的折磨一直笼罩在我的身边,还是强忍着自己的意识睡了一小时,一小时反复醒了五六次,把星期天网络赛的板子整理了一下,然后又睡觉了。

12点,吃完饭了。

躺了一个小时,在睡觉和玩手机交题度过,然后一点半开始登录。

开局看了
T1
一读就是熟悉的味道,让人难以接受的题面风格。但是吃了三次答辩的我已经见怪不怪。
看到输入中有一个条件让人耳目一新,当自己的输入是"yourname"的时候要把账号替换成你的名字,否则就禁赛处理???
想了一会这个题目的评测机制,感觉普通spj也实现不了的样子,觉得很神奇。题面很简单,照着要求模拟一下即可,也没啥太恶心的东西。

T2
看了一下T2,此时我脑子里是? ? ? ? ? ? ? ? ?
莫非,是个cy出的大模拟??我先看看别的题吧

扫了一遍题目,咦这个T5题面这么短,我就读了一遍,很快理解了题意,感觉T5的读题风格显然不同于别的题面,看完之后一脸懵逼,想了一会觉得很难,感觉想不明白,然后思考了一会,看了眼榜于是决定回来搞搞T2。

于是又回到了答辩,看着难以忍受的题面,我理清了题目想表达的意思,不过也是够答辩的。总体题意就是:
六种颜色,八个牌号,问你自己的牌型有多少种,然后你可以询问一次排除答案,询问以问三种颜色和元素总和的方式询问。排除答案的数量是min(k1,k2),k1,k2分别为回答是或不是排除的答案数量,问你询问一次后你手里牌的可能数量(去掉排除的)。
看了眼数据范围,模拟一下写个dfs预处理C(6,3)的所有三元组,然后元素总和枚举[3 , 24]即可,暴力算算排除的和未排除的,然后取一个min就做完了。

做完前两题花了30min。
然后我看了一眼榜单,我发现有人过了T5,心里暗想着T5应该不难。
然后我就去看了T5,然后我手玩了一下,我发现一些好玩的性质:
第一个栈用了 i i i个,第二个栈用了 j j j个,此时留在数组里的数量好像是一个定值耶。我们采取这样的策略,就是能删就删的策略就可以让这个数组大小固定[因为我们肯定要尽可能的小]。
我们就定义 c n t [ i ] [ j ] cnt[i][j] cnt[i][j]为第一个栈用了 i i i个,第二个栈用了 j j j个,此时留在数组里的数量。这个转移我们可以用一个类似于dp的转移得到。
即考虑 c n t [ i ] [ j ] cnt[i][j] cnt[i][j] c n t [ i − 1 ] [ j ] cnt[i-1][j] cnt[i1][j]或者 c n t [ i ] [ j − 1 ] cnt[i][j-1] cnt[i][j1]转移,接下来的问题就是怎么判断数组是否有 k k k个相同的元素呢,如果我们要是加的是 a [ i ] a[i] a[i]元素,那我们就看看cnt[i - 1][j]这个状态里面有多少个a[i],显然这部分可以由处理得到,我赛场上用了一个vector配合upper_bound的做法去得到数组里面含有 a [ i ] a[i] a[i]的元素个数。
好了,现在这个 c n t [ i ] [ j ] cnt[i][j] cnt[i][j]可以由两个状态转移了,我们就考虑dp一下转移顺序吧。我们dp方式就是 d p [ i ] [ j ] dp[i][j] dp[i][j]表示第一个栈用了 i i i个,第二个栈用了 j j j个此时数组使用的最大数量是多少。
那我们的转移方式就是
1.从dp[i - 1][j]转移
d p [ i ] [ j ] = m i n ( d p [ i ] [ j ] , m a x ( d p [ i − 1 ] [ j ] , c n t [ i − 1 ] [ j ] + 1 ) ) dp[i][j] = min(dp[i][j] , max(dp[i - 1][j] , cnt[i -1][j] + 1)) dp[i][j]=min(dp[i][j],max(dp[i1][j],cnt[i1][j]+1))
m a x ( d p [ i − 1 ] [ j ] , c n t [ i − 1 ] [ j ] + 1 ) max(dp[i - 1][j] , cnt[i -1][j] + 1) max(dp[i1][j],cnt[i1][j]+1)是什么含义呢,就是表示前面转移取出来一个数的话,势必要多用一个数组位置,然后我们看看和之前开的数组大小是否能装下,不能装下就"撑开"。
2.从dp[i][j - 1]转移
同理
d p [ i ] [ j ] = m i n ( d p [ i ] [ j ] , m a x ( d p [ i ] [ j − 1 ] , c n t [ i ] [ j − 1 ] + 1 ) ) dp[i][j] = min(dp[i][j] , max(dp[i][j - 1] , cnt[i][j - 1] + 1)) dp[i][j]=min(dp[i][j],max(dp[i][j1],cnt[i][j1]+1))

然后过了样例交了一发就1a了QaQ,我是本科组全场第二个过的qaq。

然后看T3,T4过了不少了,然后我就开始收拾烂摊子,心想有机会 a k ak ak

于是开看T3
T3显然是一个很好写的大模拟,用一个优先队列维护结束位置,用户编号,碗号就可以了。好的,我经常被这样的题折磨了很多次!我知道一个好写的写法!就是提前先把 m m m个碗放进去,就少了很多不必要的判断,即判断优先队列里面的元素个数是否小于等于 m m m。然后很快的就写完了。

此时已经过去了 1 h 1h 1h
看了一眼榜, r k 1 rk1 rk1的那名老哥倒着开题,只差了 T 3 T3 T3了。

然后我去开T4
T4
一眼读完是一个大模拟,感觉时间复杂度显然不够用!然后感觉有种拓扑性质,然后发现貌似两个编号的拓扑关系只跟上面相邻位置有关(边界),要判断相邻位置即可。预处理的时候就是看看每个元素的上方,上面如果相邻元素和自己一样就不用管了,这两个是一家人,如果不相同的话,那么肯定是上面的先拿走了,自己再拿走,那我们就加边!然后我们按照这样的方式加边肯定得到一个有向图,然后跑一次拓扑序,题目貌似还要求了最小字典序,这好办,我们在跑拓扑序的时候用优先队列维护!我们只拿出来最小的。这样,你就获得了一个26的好成绩,然后我的做法在接下来的50min一直在mle和wa中度过。

不知道T4的神奇例子是什么,也许是我做法的问题,我觉得国赛的样例还是比较神奇的,感觉骗骗也能骗很多分,我的T4应该不是正解,但是还是骗到了26分,没有以 a k ak ak收尾,但是以 116 116 116收尾也是对得起自己的竞赛生涯了。

下赛季加油!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
解题思路如下: 对于2023国赛C题,我们可以按照以下步骤来解决问题: 1. 第一问: 首先,需要根据题目所给的数据和条件进行合理的建模。可以使用MILP模型来求解问题二,并根据销售空间及最小陈列量进行相应的限制。在求解阶段,可以设计0编码机制来适应销售空间限制,并通过修复机制保持染色体的合法性。另外,可以利用问题二中构建的动态调整模型进行调价决策。 2. 第二问: 对于问题二,需要分析各种类蔬菜的销售总量与成本加成定价之间的关系。可以建立集成拟合模型来拟合每种蔬菜单品的销量与成本利润率之间的关系。然后,根据成本利润率来确定销量,并给出每种蔬菜品类未来一周的日补货总量和定价策略。可以构建以最大化商超收益为目标的混合整数线性规划模型,并使用遗传算法对模型进行求解。 3. 第三问: 针对问题三,需要分析蔬菜各品类及单品销售量的分布规律及相互关系。可以从三个角度进行剖析: a) 各种类蔬菜的销售量分布和蔬菜种类与销售量之间的关系;b) 各种类蔬菜的销售量的月份分布和各种类蔬菜销售量与月份之间的相关关系;c) 各种类蔬菜的销售时间分布和销售时间与退货量之间的相关关系。可以利用箱线图和折线图来描述销量的分布特征,使用Kolmogorov-Smirnov分布检验来验证分布的一致性,并进行相关性分析来计算相关系数。 以上是解决2023国赛C题的一些思路和方法。希望对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值