[UPC](8840)Medical Checkup ---- 思维

版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 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;
}

猜你喜欢

转载自blog.csdn.net/m0_37624640/article/details/82192482