分享下我的简单方法

· · 题解

模拟题

我的代码量很少也比较简单 建议不会的朋友看我的(傲娇

这次与上次的题解相比改进了一点 希望管理员通过

话说我第一次通过审核了 改进了一下管理员咋不批准了。。。

下面进入正题

  1. 首先我们要知道模拟什么

    根据题意

    我们要求所有同学都接完水需要多少秒。

    那么我们就模拟他们接水的过程

    我们可以用一个循环模拟m个水龙头一秒的接水量 (循环一次就是一秒)

    当然要到数组

    数组下标就是每个水龙头的标号 (1-m)

    那么数组的值就是对应的学生对应的接水量

    刚开始时1-m个水龙头默认的对应1-m编号学生的接水量

    一旦有一个学生接完了 那么就让下一个等待接水的学生来这个水龙头接水

    用代码实现的话就是让下个学生对应的接水值赋值这个这个水龙头对应的数组

    先看这一段的代码

    for(int i=1;i<=m;i++)     //  枚举m个水龙头 
    {
        s[i]--;
        if(s[i]==0)
        {
            s[i]=s[t];     //  如果这个学生的水接完了 模拟换下一个学生来这个水龙头
            t++; 
        }
    }
    ans++;      //  以上是模拟的1秒钟的接水时间 所有ans加一 

    这里的t就是下个等待接水的学生的编号

核心代码讲完了 来处理下细节 就搞定了

2.当然上面的代码是套在一个while里的 那么循环的终止条件是什么呢

首先我像大家解释t的初始值为m+1 因为一开始m个学生在接 下一个学生就是m+1

那么循环的终止条件就是(t<=m+n)

因为n个学生都接完水会让t最终加n个1 但t的初始值又是m+1

所以当t=m+n+1时意味着所有学生都接完水了 (建议认真思考下这)

下面是完整的AC代码 如果上面有不清楚的地方请借助代码理解

    #include <iostream>
    using namespace std;
    int s[11000],ans;    // 根据t的终止条件来想下s的大小
    int main()
    {
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>s[i];    //  输入每个学生的接水量
    int t=m+1;   // t用来记录下个学生的编号 
    while(t<=n+m)
    {
        for(int i=1;i<=m;i++)     //  枚举m个水龙头 
        {
            s[i]--;
            if(s[i]==0)
            {
                s[i]=s[t];     //  如果这个学生的水接完了 模拟换下一个学生来这个水龙头
                t++; 
            }
        }
        ans++;      //  以上是模拟的1秒钟的接水时间 所有ans加一 
    }
        cout<<ans;
        return 0;
    } 

写题解不易 还望各位点个赞!