牛客真题编程——day6

编译环境: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时,输出此时需要复习的最小时间即可。

代码部分实现:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值