赛后来看真的感觉是一道很简单的题,其实赛中就已经有点思路了,但是 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;
}