聚餐

聚餐

赛后来看真的感觉是一道很简单的题,其实赛中就已经有点思路了,但是 wa 了很多发,下一次要是还是一直 wa ,可能是因为代码改过了很多版所以思路有一点乱吧,补题的时候就是把整个题的思路都理清了之后才开始敲的代码,思路理顺了之后,写起来就很流畅了,几分钟就写完了,一发 Ac。要是下次还是一直 wa 的话就尝试一下,重头再敲一份代码吧,说不定效果会好很多。

思路:因为这道题数据不大\(1≤n≤1000,1≤d,a[i]≤10^6\),但是不注意的话还是会 tle,因为a[i]达到了1e6,如果去遍历a[i]可能的值,一些比较跨度大的数据就会让代码每选择一个座位都走一个1e6的数量级,而当n=1000时很显然就会 tle 了。

所以我们选择去遍历已选择的座位的值,==首先如果a[i]这个座位可以安排的话那么最好肯定时安排在a[i]了==,如果不行,那么我们就去遍历我们已经安排好的那些座位s[i],那么可供我们选择的座位就有s[1]+d,s[2]+d...s[cnt]+d,那为什么不会是s[i]-d,因为如果s[i]-d成立的话,那么s[i-1]+d肯定也会成立,这个时候需要单独考虑一下会不会是s[1]-d,不是,因为如果s[1]-d成立的话,那么肯定在a[i]这个位置(前面已经判断过了,高亮部分),就已经成立了。

每一次把已选位置 sort 一下是为了保证得到的是最小值

代码:

// Created by CAD on 2019/8/21.
#include <bits/stdc++.h>
using namespace std;

int a[1005],s[1005];
int cnt=0,d;
bool judge(int pos,int x)
{
    if(pos<a[x]) return false;
    for(int i=1;i<=cnt;++i)
        if(abs(pos-s[i])<d)
            return false;
        return true;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n;cin>>n>>d;
    for(int i=1;i<=n;++i) cin>>a[i];
    s[++cnt]=a[1];
    cout<<a[1];
    for(int i=2;i<=n;++i)
    {
        if(judge(a[i],i))
        {
            s[++cnt]=a[i];
            cout<<" "<<s[cnt];
            continue;
        }
        sort(s+1,s+cnt+1);
        for(int k=1;k<=cnt;++k)
            if(judge(s[k]+d,i))
            {
                s[++cnt]=s[k]+d;
                cout<<" "<<s[cnt];
                break;
            }
    }
    cout<<endl;
}
上一篇:SD模块的几个增强(VA01-VA03,VA41-VA43)


下一篇:对拍模板