版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/82192482
Hint: ICPC 2017 Japan Tsukuba
题意:
- 有n个同学排成一队,要去体检1,2,3,4,……等等几个体检项目,同学的编号也是1,2,3,…… n
- 要求:必须要个遵守同学的编号进行项目体检。允许多个项目同时进行。
- 问当时间到达t的时候,各个同学都在体检或等待体检那个体检项目,输出这些体检项目的编号。
做法:
- 这个题,要动脑筋稍微想一下……而我的脑筋却想成了模拟操作系统的先来先服务算法_(:з」∠)_
- 当轮到第i的同学的时候,他能不能进行取决的前面是否有在进行体检的人。
- 很明显能够发现就是,每个人体检第一个项目的时候(除了第一个人),都需要等待前面的人体检完第一个项目、
- 所以找这个状态!
- sum = (h1+h2+h3+……hi) 表示当i个人已经体检完第一个项目后已经过了的时间,剩下的时间就是t - sum
- 那么剩下的时间由谁来决定呢?
- 应该由当前体检时间最长的人来决定。当前时间最长的人可以和第i个人合并,因为最长的人一定会囊括这个人。
- 所以ans = (t-sum)/max(h)+2 。为什么加2呢,其中一个1,是因为正在进行或等待,一定是区间的右端点,即[1,2] 一定是 2
- 另一个1是前面已经完成了第一个项目。
参考:https://blog.csdn.net/NPU_SXY/article/details/79837303
AC代码:
#include<bits/stdc++.h>
#define IO ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define rep(i,s,t) for(int i = (int)(s); i <= (int)(t); i++)
#define rev(i,t,s) for(int i = (int)(t); i >= (int)(s); i--)
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x).size()
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 2e5+5;
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
int a[maxn];
inline int read()
{
char x;
while((x = getchar())<'0' || x>'9');
int u = x-'0';
while((x = getchar())>='0' && x<='9') u = (u<<3)+(u<<1)+x-'0';
return u;
}
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL_FILE;
int n,t;
n = read(); t =read();
for(int i=1;i<=n;i++) a[i] = read();
ll ans = 0;
int mx = -1;
ll res;
for(int i=1;i<=n;i++){
mx = max(mx,a[i]);
ans+=a[i];
if(t>=ans) res = (t-ans)/mx+2;
else res = 1;
printf("%lld\n",res);
}
return 0;
}