当前位置: 代码迷 >> 综合 >> UVALive 8076 Workout for a Dumbbell
  详细解决方案

UVALive 8076 Workout for a Dumbbell

热度:89   发布时间:2023-11-23 06:31:44.0

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=6098

题意简介:

Jim想起了初中生物书上的蛋白质,于是要锻炼肌肉。当然这一段是跟题意没关系的。
健身房有十台机器,现在给出了Jim在每台机器的锻炼时间和休息时间,机器不是Jim专属的,
每个机器上还有一个专一锻炼者在锻炼,专一锻炼者有自己的锻炼时间,休息时间和开始时间,
在开始时间之后,就开始不停的在这台机器上锻炼休息锻炼休息循环往复,
(专一锻炼者只用一个机器,相当专一了)
Jim在0时刻从1号机器开始锻炼,一直锻炼到10号机器,要锻炼三个来回。
问锻炼完之后一共需要多少时间,最后一个锻炼的休息时间不计算在内。

分析:

一看就是模拟题目
因为Jim是从1号到10号有序进行的用use[],rest[]分别代表Jim在每台机器上的锻炼时间和休息时间
用u2[],r2[]分别代表每个机器上的专一锻炼者的锻炼时间和休息时间
用st[]表示专一锻炼者每次的开始时间,st[]是要更新的,因为他是循环往复锻炼的ans记录现在的时间,j记录现在要开始锻炼哪一台机器了要是此时这台机器上的专一锻炼者的st[j]在ans之后,那么Jim就可以直接锻炼,此时专一锻炼者的st[j]是要更新的,如果Jim锻炼完专一锻炼者还没开始,那么st[j]不变如果Jim锻炼完已经超过了st[j],那么st[j]要更新成Jim锻炼完的时间如果此时这台机器上的专一锻炼者的st[j]在ans之前,那么Jim就要等一下才能锻炼,找最近的开始时间,判断一下专一锻炼者是在锻炼还是在休息,锻炼的话,Jim就等休息的话,直接开始锻炼,顺便更新下一次专一锻炼者的st[j]

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
const int inf=0x3f3f3f3f;
double pi=3.141592653589793238462643383279502884;
const ll mod=1e9+7;
const int maxn=300005;
int use[35],rest[35];
int u1[11],r1[11],st[11];
int ans;
int main()
{while(~scanf("%d %d",&use[1],&rest[1])){ans=0;for(int i=2;i<=10;i++)scanf("%d %d",&use[i],&rest[i]);for(int i=1;i<=10;i++)scanf("%d %d %d",&u1[i],&r1[i],&st[i]);for(int i=1;i<=30;i++){//锻炼第几个器材int j=0;if(i%10==0)j=10;elsej=i%10;if(st[j]>ans)//专一锻炼者还没开始{ans+=(use[j]+rest[j]);if(st[j]<=ans-rest[j])//更新st[j]st[j]=ans-rest[j];}elseif(ans>=st[j]){while(st[j]+u1[j]+r1[j]<=ans)st[j]+=(u1[j]+r1[j]);//找最近一次的专一锻炼者开始时间if(ans<=st[j]+u1[j])//专一锻炼者正在健身{ans=st[j]+u1[j];//等锻炼者锻炼完我进行ans+=(use[j]+rest[j]);st[j]=max(st[j]+u1[j]+r1[j],ans-rest[j]);//更新st[j]}else//锻炼者正在休息,Jim先进行,更新st[j]{ans+=(use[j]+rest[j]);st[j]=max(st[j]+u1[j]+r1[j],ans-rest[j]);}}}ans=ans-rest[10];printf("%d\n",ans);}return 0;
}

 

  相关解决方案