题解:P15040 [UOI 2022 II Stage] 竞赛

· · 题解

思路

思路一

暴力,从 t 开始每次将 t 减去 w,计算在此期间进入的学生数,若学生数已经超过班里的总人数则直接输出班里人数。

代码

#include<cstdio>
int main()
{
    int n,m,w,t;
    scanf("%d%d%d%d",&n,&m,&w,&t);
    int ans=0;
    for(int i=1;;i++)
    {
        if(t-(i-1)*w<0)break;//第i批进入考场的学生在考试前[t-(i-1)*w]分钟进入考场
        else ans+=m;
        if(ans>n)
        {
            ans=n;
            break;
        }
    }
    printf("%d",ans);
    return 0;
}

由于数据范围较小,此种方法也能 AC。

思路二

思考考试开始前一共有几批学生能进入考场。

若有 k 批学生(除第一批外)进入考场,则进入考场的时间点为 t,t-w,t-2w,\dots,t-kw。因为最后一次进入考场的时间要大于或等于 0,所以 t-kw\ge0,解得 k\le\frac{t}{w},又因为 k 是整数,所以 k 最大能取到 \lfloor\frac{t}{w}\rfloor。总批次为 \lfloor\frac{t}{w}\rfloor+1

因此进入考场的学生总数为 \min(n,(\lfloor\frac{t}{w}\rfloor+1)\times m)

代码

#include<cstdio>
int min(const int &a,const int &b){return (a<b?a:b);}
int main()
{
    int n,m,w,t;
    scanf("%d%d%d%d",&n,&m,&w,&t);
    printf("%d",min(n,(t/w+1)*m));
    return 0;
}