happybob
2024-11-18 16:56:42
次数限制这么松,该考虑我们随机化算法了!
首先有一个想法是朴素的冒泡排序,操作
我们考虑随机化,进行至多
实测操作次数不超过
代码:
int cnt = 0;
while (cnt < (int)5e5 && !is_sorted(a.begin() + 1, a.begin() + n + 1))
{
shuffle(p.begin() + 1, p.begin() + n + 1, rnd);
bool tag = 0;
for (int i = 1; i <= n; i++)
{
int j = p[i];
if (j != n && a[j] > a[j + 1] && a[j + 1] + k <= a[j])
{
tag = 1;
pushans(j);
cnt++;
break;
}
}
if (!tag)
{
for (int i = 1; i <= n; i++)
{
int j = p[i];
if (j != n && a[j + 1] + k <= a[j])
{
tag = 1;
pushans(j);
cnt++;
break;
}
}
if (!tag)
{
for (int i = 1; i <= n; i++)
{
int j = p[i];
if (j != n)
{
tag = 1;
pushans(j);
cnt++;
break;
}
}
}
}
}