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

#include <iostream>
#include<bits/stdc++.h>
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<<j<<endl;
        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]<<endl;
    return 0;
}