ECNA 2017 Problem J: Workout for a Dumbbell 模拟

参考博客
提交链接
FROM SDUT 2018 Summer Team Contest 8th 地址

#include 
#include
using namespace std;
/*
题意 :【模拟】健身中心一共有10台健身机,我从1-10按照顺序 共锻炼3次,
我在每台健身机上有两个时间,一个是锻炼时间,另一个是休息时间
另外每台健身机都有一个捣乱的人在不停的循环锻炼,他们也有
两个时间,一个是锻炼时间,另一个是休息时间。因此他们可能会耽搁到
我进行锻炼,他们还有一个到达时间,指他们第一次开始锻炼的时间。
在同一时间假如我和捣乱的人同时到达一台健身机,我会让给他们进行锻炼。
假定我在0时刻开始打算在第一台健身机上去锻炼。我在最后一次锻炼后
的时间可以忽略不计。

按照题意进行模拟即可。

*/
int main()
{
    int duan[40],xiu[40];
    int d[40],x[40],st[40];
    for(int i=1;i<=10;i++)
    {
        cin>>duan[i]>>xiu[i];
    }
    for(int i=1;i<=10;i++)
    {
        cin>>d[i]>>x[i]>>st[i];
    }
    int sum = 0;
    for(int i=1;i<=30;i++)
    {
        int j = i%10==0?10:i%10;
       //cout<
        if(sum>=st[j])
        {
            int tmp = sum-st[j];
            int k = tmp/(d[j]+x[j])*(d[j]+x[j]);
            //求出我在等待之后可以开始使用机器的时间
            //假如sum = 20,d[j] = 2 x[j] = 3,st[j] = 12
            //那么求出k = 5, st[j]+=(5+2);st[j] = 19
            st[j]+=(k+d[j]);
            sum =max(sum,st[j]);
            st[j]+=x[j];
            //经过上述操作后,第j个捣乱的人的开始时间肯定刚好大于sum
            //并且sum取了sum,st[j],使得在下面计算时保证了我不被其他人耽搁
        }
        //假如当前时间早于在该机器上的到达时间
        sum+=duan[j];
        st[j] = max(sum,st[j]);
        //更新捣乱的人的到达时间,因为他因为我被耽搁了
        sum += xiu[j];

    }
    cout<<sum-xiu[10]<return 0;
}

你可能感兴趣的:(ACM-经典题目合集,新突破,新知识,2018ACM训练题目+思考)