zoukankan      html  css  js  c++  java
  • 【CodeForces 730H】Car Repair Shop

    BUPT 2017 summer training (for 16) #1F

    题意

    依次有n (1 ≤ n ≤ 200) 个车要修理,每个车希望在s[i]时刻开始修理,时长d[i],如果s[i]后面没有那么多空的时间,那么就选最小的可行的起点。(s_i, d_i (1 ≤ s_i ≤ 10^9, 1 ≤ d_i ≤ 5·10^6))

    题解

    模拟,先看从s[i]时刻开始修理,和之前i-1个是否冲突。如果冲突,就枚举每个s[j]+d[j]时刻开始,看是否冲突,再从中选择最小的时刻。

    代码

    #include <cstdio>
    #include <algorithm>
    #define N 201
    #define inf 0x3f3f3f3f
    using namespace std;
    int n;
    int s[N],d[N];
    bool ck(int i,int j){
        return s[j]>s[i]+d[i]-1 || s[i]>s[j]+d[j]-1;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            scanf("%d%d",&s[i],&d[i]);
        for(int i=1;i<=n;++i){
            bool fromS=true;
            
            for(int j=1;j<i;++j)
                if(!ck(i,j))
                    fromS=false;
            
            if(!fromS){
                int ss=inf;
                for(int j=0;j<i;++j){
                    s[i]=s[j]+d[j]+(j==0);
                    bool valid=true;
                    for(int k=1;k<i;++k)
                        valid&=ck(i,k);
                    if(valid) ss=min(s[i],ss);
                }
                s[i]=ss;
            }
            printf("%d %d
    ",s[i],s[i]+d[i]-1);
        }
        return 0;
    }
    
  • 相关阅读:
    oracle DBA 常用表和视图
    oracle 索引聚簇表的工作原理
    二进制手表
    二分查找
    二分查找
    排列硬币
    将每个元素替换为右侧最大元素
    搜索插入位置----二分查找
    合并两个有序数组
    在Nuxt遇到的坑
  • 原文地址:https://www.cnblogs.com/flipped/p/7202412.html
Copyright © 2011-2022 走看看