编译环境:c++
1、附加题
描述:
存在n+1个房间,每个房间依次为房间1 2 3...i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略:
A. 如果访问过当前房间 i 偶数次,那么下一次移动到房间i+1;
B. 如果访问过当前房间 i 奇数次,那么移动到房间pi;
现在路人甲想知道移动到房间n+1一共需要多少次移动;
算法思想:题目有两个规则:访问奇数次回跳(因为pi<=i);访问偶数次,访问下一个房间。所以可知,当路人甲到达N时,前面的n-1个房间的访问次数一定都是偶数,根据动态规划思想,得到关系子式:dp[i] = dp[i-1] +1 + (dp[i-1] - dp[a[i-1]] + 1) ,(第一次到达n的次数+1+重新回到n-1的次数再+1)据此求解得到到达N+1的次数。
代码部分实现:
2、循环数比较
描述:
对于任意两个正整数x和k,我们定义repeat(x, k)为将x重复写k次形成的数,例如repeat(1234, 3) = 123412341234,repeat(20,2) = 2020.
牛牛现在给出4个整数x1, k1, x2, k2, 其中v1 = (x1, k1), v2 = (x2, k2),请你来比较v1和v2的大小。
输入描述:
输入包括一行,一行中有4个正整数x1, k1, x2, k2(1 ≤ x1,x2 ≤ 10^9, 1 ≤ k1,k2 ≤ 50),以空格分割
算法思想:
由于输入整数过大,需要使用字符串存储,以k1k2为循环次数,依次将字符串形式存储的x1x2连接成一个新的循环数即可。然后用符号直接比较大小即可,注意要将所有的情况包括进来。
代码部分实现:
(引用字符串库,直接用比较符比较)
3、奖学金
描述:
小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。在考试前,小v他已经知道每门课的平时成绩为ai ,假设付出的时间与获得的分数成正比,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。问小v为了拿到奖学金,至少要花多少时间复习?
算法思想:
根据题目要求,首先建立课程结构体存储每节课的平时成绩、花费时间;记录下所有课程的总平时成绩,如果达标则不需要复习;否则,需要将所有课程按照花费时间从小到大优先级排序,保证花费时间最少,求得需要复习提高的分数,遍历所有课程,不断削减需要拿到奖学金的分数,同时累加时间。当差值为0时,输出此时需要复习的最小时间即可。
代码部分实现: