苹果消耗问题:算法设计与边界条件处理

1. 问题分析与算法设计

这个题目看似简单,但实际上考察了几个重要的编程概念和边界条件处理。我们先来拆解题目要求:

题目描述:有一箱n个苹果,其中混入了一条虫子。虫子每x小时能吃掉一个苹果,并且在吃完一个苹果之前不会开始吃另一个。问经过y小时后,还剩下多少个完整的苹果?

1.1 核心逻辑解析

关键在于理解虫子吃苹果的规则:

  1. 虫子吃苹果是"串行"的,不是"并行"的
  2. 只有当完全吃完一个苹果后,才会开始吃下一个
  3. 如果吃苹果的时间不足一个完整周期,那个苹果也算被"破坏"了

举个例子:

  • 如果x=4小时/苹果,y=9小时
  • 虫子可以吃完2个苹果(4+4=8小时)
  • 第9小时时,已经开始吃第3个苹果
  • 所以总共"消耗"了3个苹果(2个吃完,1个正在吃)

1.2 边界条件考虑

需要特别注意的边界情况:

  1. 当y=0时,应该返回n(没有时间消耗)
  2. 当x=0时,理论上虫子瞬间吃完所有苹果(但题目保证输入均为正整数)
  3. 当y/x的结果超过n时,应该返回0而不是负数
  4. 当y正好是x的整数倍时,不需要额外+1

需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。

2. 代码实现详解

让我们逐行分析给出的C++解决方案:

cpp复制#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,x,y;
    cin>>n>>x>>y;
    
    if(y%x == 0){ // 判断是否有余数
        if(n-(y/x) >= 0){ // 检查箱子里是否还有苹果
            cout<< n-(y/x);
        }else{
            cout<< 0;
        }
    }else{ // 有余数,需要多算一个苹果
        if(n-(y/x+1) >= 0){
            cout<<n-(y/x+1);
        }else{
            cout<<0;
        }
    }
    
    return 0;
}

2.1 输入处理

cpp复制int n,x,y;
cin>>n>>x>>y;

这部分很简单,就是读取三个整数输入:苹果总数n,虫子吃一个苹果所需时间x,以及总时间y。

2.2 核心逻辑分解

代码的核心是处理两种情况:

  1. y是x的整数倍

    cpp复制if(y%x == 0){
        if(n-(y/x) >= 0){
            cout<< n-(y/x);
        }else{
            cout<< 0;
        }
    }
    
    • 计算y/x得到吃掉的完整苹果数
    • 检查剩余苹果是否非负
    • 输出结果或0(如果不够)
  2. y不是x的整数倍

    cpp复制}else{
        if(n-(y/x+1) >= 0){
    

内容推荐

已经到底了哦
已经到底了哦