知识点:
枚举
思路:
按顺序来为每一个牛i安排位置
然后j用来表示他的位置
检查以入座的牛p和j有没有abs(p-j)<d
如果有p说明j不能用了,并记录最小的p和最大的p
我的这个思路不太好,但是对于我来说很直观。
我观看了https://ac.nowcoder.com/acm/problem/blogs/21781 的题解,发现他的方法好像更快。
他的思考是每一次安排位置后,排序(不包含最新加入的),这样只要去看旧的里面有没有不符合的位置(他的哪个判断可以改成abs(p-j)<d)
我的代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<cfloat>
#include<set>
#include<unordered_map>
using namespace std;
void solve() {
int n, d,index=0;
cin >> n >> d;
vector<int> a(n);
vector<int> pos;
for (int i = 0;i < n;i++) cin>>a[i];
//按照顺序安排位置
for (int i = 0; i < n; i++)
{
//安排第i只牛,j是他的位置
int j = a[i];
while (1) {
bool ok = true;
int newpos = j,newpos1=j;
// check
for (int p : pos)
if (abs(p - j) < d) ok = false,newpos = max(newpos, p),newpos1 = min(newpos1, p);
// 成功安排
if (ok) {
pos.push_back(j);
break;
}
// 未成功,优先按照最大的位置进行更新
if (newpos > j)
j = newpos + d;
else j = newpos1 + d ;
}
}
for (int j : pos) cout << j << " ";
}
int main() {
std::ios::sync_with_stdio(false); std::cin.tie(0);
solve();
return 0;
}

京公网安备 11010502036488号