“华为杯”山东理工大学第十届ACM程序设计竞赛 - 解题报告

“华为杯”山东理工大学第十届ACM程序设计竞赛 - 解题报告

出题组:

  • bLue
  • 豪子
  • MLE_kenan
  • xXx
  • axuhongbo
  • suyu
  • MeiK
  • sdk2

这里写图片描述
由于服务器崩溃和数据范围错误给参赛选手带来的问题,出题组在此向大家道歉。


#热身赛

##[4244] A - 死亡的 cyk
@(by MeiK)

此题是特判题,本意是概率AC,即这一次提交与下一次提交后台的正确输出数据是不同的,比赛时由于服务器问题导致空代码也可过。

##[4245] B - 郭鑫的难题(一)
@(by axuhongbo)

签到题,求出最大最小值相减即可

参考代码

##[4243] C - cyk的小学数学题
@(by sdk2)

模拟即可

参考代码

##[4233] D - 连续序列
@(by suyu)

贪心或dp

参考代码

##[4230] E - 圆
@(by suyu)

此题需要一定的几何基础。

参考代码

[4231] F - 几何递推

@(by suyu)

因为情况少,可以尝试手动画出来。也可以通过递推解决。

参考代码


#正式赛

[4246] A - 三角形

@(by suyu)

签到题

参考代码

[4239] B - Guns and Roses (1)

@(by axuhongbo)

基础博弈:解释下样例123 8,首先用123去除9,得到商为13余数为6. 于是我们可以先报6然后让此后每一轮的大家报数的和为9. 这样可以保证最后一轮中对方无论报什么数都无法让总数到达123,因为到了最后一轮时,若用123去减此前所有报数之和肯定为9.这时,对方无论报1到8任何一个数都无法取得胜利,我们只需要报最后一个与其相加为9的数即可获得胜利。
推广与延伸
此类问题,可用以下公式解决 【 总数 除以(可报数最大值+可报数最小值)】 所得的余数即为第一次报的数,以后每次报与对方数相加为【可报数最大值与最小值之和】的数。若无余数则无法保证胜利。

参考代码

[4242] C - SDUT集训队夏季选拔

@(by axuhongbo)

题目大意是,n个人,每个人有三个成绩等级值a,b,c,求出 不存在 有人的所有的成绩等级都比其高的人 的个数。当然,这里的题目设定有些不同,成绩等级越小代表成绩等级越高。
这里我们利用线段树,将人按照成绩等级从小到大(也就是从高到低)排序,边查询(1,num[i].b)区间成绩等级c的最小值,边更新(1,num[i].b)区间成绩等级c的最小值。
由于是边查询边更新,保证了得到的区间是满足成绩等级a和成绩等级b都小于(高于)当前成绩等级的a,b的,只要保证这个区间中的最小成绩等级c大于(低于)当前成绩等级c,那么当前此人满足要求。
当然cdq分治也是可做的,有掌握该算法的同学可以自行尝试。

参考代码

[4232] D - acm

@(by suyu)

签到题,比赛时有一部分选手是因为题目数据范围给出的不对而wa,赛后已更正数据全部重判。

参考代码

[4229] E - 剪子-包袱-锤

@(by axuhongbo 改编)

首先需要注意的是机器人的策略,这个策略是很符合逻辑的,首先统计对手已经出过的剪刀石头布的次数,然后如果对方出哪个比较多,然后他会猜测对手下次也会继续出对方出的比较多的那个,那么机器人下次肯定会出能克制对手的招式,只有当对手出过的剪子包袱锤的次数最多的招式不止一个时,才用到优先级判断。
接下来就大体可以分为两种做法,如果你手动推算两三种招式的话,就会发现,广泛的来看,六种情况(三种招式的大小情况一共有6种)下你要想全胜的做法都是以6为循环节的(即使有一些小于6),接着你推出所有6种情况,判断输出即可。
另一种做法就是完全按照题意模拟即可。

参考代码-做法1
参考代码-做法2
##[4235] F - 关灯计划
@(by bLue)

同时遍历两个字符数组,如果存在某个位置,在第一个数组上是 .,第二个数组上是是 @,则标记为无法达成;若在第一个数组上是 @,而第二个数组上是 .,则记为要关灯的房间。最后根据情况输出即可。

参考代码

[4249] G - 流量那些事儿

@(by bLue)

按题意模拟即可。应注意流量使用 long long 计算,流量包过期和有效期顺延等情况都要考虑到。

参考代码

[4241] H - menhera酱那惨不忍睹的数学

@(by 豪子)

(此题用到最大流算法或二分图,还没学习过的建议以后再看)

因为每个式子出现的答案只能出现一次,我们可以联想到网络流模型。关键是如何建模呢?
如果我们把每个式子看成一个点,每个式子的加、减、乘、除所计算的结果看成一个点,然后两者对应连边,
所有的式子跟源点s相连,所有结果跟汇点相连,所有边的流量都是1。那么跑一次最大流,如果最大流是n说明,
每个式子都能找到一个互不相同的答案,表示有解,否则,无解。输出答案二分图只要记录好路径就可以了,最大流就是去找出发点为式子并且流量为0的边(这里不做详细解释)。
模型:
这里写图片描述

参考代码-网络流版
参考代码-二分图匹配版

[4248] I - 集训队的纪念品

@(by bLue)

贪心,将物品和人所拥有的钱排序,然后暴力枚举或二分查找。

参考代码1
参考代码2

[4247] J - Alice and Bob

@(by MLE_kenan)

浮点数背包,假设所有数都是整数,设背包的容量为n,dp[i]就为恰好能凑出钱数为i的方案数,首先我们先推出状态转移方程:

dp[j]=dp[j]+dp[j-a[i]]

含义为我们可以通过凑出钱数为j-a[i]的方案数来递推出钱数为j的方案数,枚举背包容量,因为钱币是无限张的,所以背包容量是从小到大枚举的。

初始化的dp数组为:

这里写图片描述

接下来只需解决浮点数问题,因为钱币的数据范围最多为一位小数,我们可以直接对钱币的价值和switch的价值乘上10,将浮点数转化为整数。值得注意的是,n不一定少于两位小数,但是n小数位数超过一位的时候,你无论怎么凑都是凑不出n,这个时候直接特判掉即可。

这个题有坑点,就是小数位数很多,用double会导致精度问题而Wrong answer,所以需要采用字符串读入,并且还要注意n还可能是个整数(实数包括整数)

参考代码

如果上述代码链接失效,请到以下链接下载
这是一个链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值