首页 > 试题广场 >

神奇苹果桶

[编程题]神奇苹果桶
  • 热度指数:417 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小希在森林冒险的时候发现一个神奇的木桶,某些时候会凭空出现一些苹果。小希很慷慨地跟大家分享了这一个神奇的木桶,让大家都能享用这些大自然的馈赠。为了方便大家来享用,小希对这一神奇的木桶的苹果数量改变进行了记录通知大家,以免在木桶空时让特意过来的人们空手而归。
 小希记录下来的数量改变有3 种:
1.苹果数量凭空增加了 m 个。
2.人们来参观时想要取走 m 个苹果,不过如果此时苹果数量不足m 则放弃此次操作,一个都不取。
3.小希取走 1/m 的苹果进行义卖活动。如果苹果数量不能整除,小希会对其进行向上取整,例如有  10 个苹果时,要拿走 1/4 ,那么小希会拿走 \lceil 10/4 \rceil = 3 个苹果
 小希记得最初时木桶中的苹果数量为 0 ,但她忘记现在苹果数量是多少了,请你帮帮她。

输入描述:
第一行 1 个整数 n ,表示会有n 次操作。
第二行 2n 个整数op_1m_1op_2m_2...op_nm_n ,其中op_i为第i 次的操作类型,m_i为对应参数。意义如题面。
 1 \leq n \leq 50000, 2 \leq m \leq 1000


输出描述:
输出一个整数表示这 n 次操作之后剩余苹果数量。
示例1

输入

5
1 2 2 3 1 5 2 4 3 2

输出

1

说明

第一次操作增加2个苹果。现在剩余2个苹果。
第二次操作尝试拿3个苹果,因为不足3个放弃此次操作。现在仍然剩余2个苹果。
第三次操作增加5个苹果。现在剩余7个苹果。
第四次操作尝试拿4个苹果,足够,拿走后剩余3个苹果。
第五次操作拿走1/2,3不能被2整除,向上取整拿走2个。拿走后剩余1个苹果。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    let n,typeList,numList,result=0
    while(line = await readline()){
        if(n){
            let list = line.split(' ').map(item=>parseInt(item))
            typeList = list.filter((item,index)=>index%2==0)
            numList = list.filter((item,index)=>index%2!=0)
        }else{
            n = parseInt(line)
        }
    }
    for(let i=0;i<typeList.length;i++){
        if(typeList[i]==1){
            result+=numList[i]
        }else if(typeList[i]==2){
            if(result>=numList[i]){
                result-=numList[i]
            }
        }else{
            result -= Math.ceil(result/numList[i])
        }
    }
    console.log(result)
}()

发表于 2025-12-10 15:58:45 回复(0)