ACGO挑战赛#8 T1~T4题解
前言
是的这篇挑战赛题解只有T1到T4的,因为本蒟蒻只做了这4题...
该篇题解方便个人总结和整理思路,如果能帮到你那么我将肥肠荣幸!
欢迎指正或者提供hack数据!违规紫衫QwQ AK大神 Orz
T1 交集
数轴上两个部分,起点和终点分别为L1,R1,L2,R2L_1,R_1,L_2,R_2L1 ,R1 ,L2 ,R2 ,输出两部分重合的长度,注意如果两部分相邻不算长度 LikeLikeLike样例3
很容易写出模拟代码毕竟数据不大
T2 比赛结果
N名玩家参加比赛,比赛结果存储在N×NN\times NN×N的二维表当中 题目描述
> 如果玩家iii战胜了玩家jjj,则Ai,jA_{i,j}Ai,j 为W;
>
> 如果玩家iii输给了玩家jjj,则Ai,jA_{i,j}Ai,j 为L;
>
> 如果玩家iii和玩家jjj打成平局,则Ai,jA_{i,j}Ai,j 为D
要去判断该二维表是否存在矛盾
简单思考一下
如果Ai,jA_{i,j}Ai,j 为W,那么相应的Aj,iA_{j,i}Aj,i 应该为L,因为玩家iii赢了玩家jjj,玩家jjj输给了玩家iii;
同理如果Ai,jA_{i,j}Ai,j 为L,相应的Aj,iA_{j,i}Aj,i 应该为W;
如果Ai,jA_{i,j}Ai,j 为D,相应的Aj,iA_{j,i}Aj,i 应该为D
这样就很简单写出判断了
T3 新建文件夹(1)
简化题目,就是输出字符串的出现次数,建立map从string映射到int型的关系即可,也是hash思想的简单应用
数据不大,模拟解决
T4 投硬币
一开始见这题想用DFS解决,但是见了数据范围知道肯定不行,毕竟DFS的话时间已经到O(2n)O(2^n)O(2n)的复杂度,这简直惊为天人!!!
但当时没思路,觉得计数器这个东西带有后效性不符合DP,所以还是先写了个记忆化DFS泪拿42pts。。。
在随后分析了一下,每次对计数器的更改只增加了当时的金额,不对后面的金额发生影响,因此没有后效性
同时又可以分阶段求解前iii次投掷可获得的最大金额,符合动态规划的特性
对于任一次硬币的操作只有正面朝上和反面朝上两种情况,要求在NNN次操作中可获得的最大金额,这不就是01背包吗!
定义DPDPDP状态表,DP[i][count]DP[i][count]DP[i][count]为第iii次投掷且计数器为countcountcount时可获得的最大金额
可得状态转移方程DP[i][count]=max(DP[i−1][count−1]+Y[count]+X[i],DP[i−1][count])DP[i][count]=max(DP[i-1][count-1]+Y[count]+X[i],DP[i-1][count])DP[i][count]=max(DP[i−1][count−1]+Y[count]+X[i],DP[i−1][count])
注:Y[count]Y[count]Y[count]为计数器为countcountcount时可获的奖金,X[i]X[i]X[i]为第iii次硬币正面朝上所获的金额
其中DP[i−1][count−1]+Y[count]+X[i]DP[i-1][count-1]+Y[count]+X[i]DP[i−1][count−1]+Y[count]+X[i]为正面时的情况,DP[i−1][count]DP[i-1][count]DP[i−1][count]为反面朝上的情况
但是特别注意:countcountcount为000时,等于i−1i-1i−1次投掷时所能获得的最大值(为了保证DPDPDP的定义)
这样就能优化到O(n3)O(n^3)O(n3)了
代码如下: