Rescheduling the Exam cf1650e

(仅做为个人笔记,反思)

题目意思:t组数据,n场考试,考试不能不会在同一天,考试时长d,给出定义:休息时长为某门考试前的天数(r-l-1)。现求改变其中一门使所有休息天数中最小值

最大,输出天数

思路:

code:

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

const int N=2e5+7;

const int inf=1e9+7;

int a[N];//存储第i门考试的时间

int n,d;//门数,周期

int check(vector<int>&v)//计算目前排列插入一门考试后的最小值

{

    int minn=inf;//如果不插入可能也会有最小值

    int maxn=0;//所以得在最大间隔内插入

    for(int i=1;i<n;i++)

    {

        minn=min(minn,v[i]-v[i-1]-1);

        maxn=max(maxn,v[i]-v[i-1]-1);

    }

    return min(minn,max((maxn-1)/2,d-v.back()-1));//所以在本身最小值,和插入后的最小值比较,返回更小的,因为要找最小值

}

int main()

{

    int t;cin>>t;//测试数量

    while(t--)

    {

        cin>>n>>d;

        int mindis=d,id=0;//最小间隔,对应的下标

        for(int i=1;i<=n;i++)//找到目前导致最小值出现的科目

        {

            cin>>a[i];

            if(a[i]-a[i-1]-1<mindis)//若找到更小的,更新数据

            {

                mindis=a[i]-a[i-1]-1;

                id=i;

            }

        }

        vector<int>v;//存储删去id后所有开始时间

        for(int i=0;i<=n;i++)

        {

            if(i==id)continue;

            v.push_back(a[i]);

        }

        int ans=max(0,check(v));//最小值的最大值

        if(id>1)//如果不是第一个,还得讨论是不是左边的那门考试导致的

        {

            v[id-1]=a[id];

            ans=max(ans,check(v));

        }

        cout<<ans<<endl;

    }

}

 

date:23.2.26

posted @ 2023-02-26 22:05  阿丰大宝贝  阅读(36)  评论(0)    收藏  举报