2021AutoX安途杯中山大学程序设计校赛 G Stack Sort I(基数排序)
Solution
基数排序的变式 (虽然我在写这题之前连基数排序是什么都不知道)
先对所有数离散化,然后对于其二进制上的每一位,
如果是 1 ,放入栈 3 中
如果是 0 ,放入栈 2 中
离散化后数组元素最大 1000 ,其二进制最多有 10 位数,即每次取出或放回操作最多执行 10 次,加起来每次执行最多 20 次操作,执行 1000 次之后也小于等于 20000
代码
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
//#define int long long
#define lowbit(x) ((x) & (-x))
using namespace std;
typedef pair<int, int> pii;
typedef pair<long, long> pll;
typedef pair<double, int> pdi;
typedef double dd;
typedef long long ll;
const int MAXN = 1010;
const int MAXM = 3000010;
const dd eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
int a[5][MAXN], cnt, t1, t2, t3;
pii p[MAXN], ans[20010];
void add(int x, int y){
ans[++cnt] = {x, y};
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n;i++)
cin >> a[1][i], p[i] = {a[1][i], i};
sort(p + 1, p + 1 + n);
for (int i = 1; i <= n;i++)
a[1][p[i].second] = i;
t1 = n;
for (int i = 0; i <= 9;i++)
{
for (int j = n; j >= 1;j--)
{
if ((a[1][j] >> i) & 1)
{
a[3][++t3] = a[1][j], t1--;
ans[++cnt] = {1, 3};
}
else
{
a[2][++t2] = a[1][j], t1--;
ans[++cnt] = {1, 2};
}
}
while(t3)
{
a[1][++t1] = a[3][t3--];
ans[++cnt] = {3, 1};
}
while(t2)
{
a[1][++t1] = a[2][t2--];
ans[++cnt] = {2, 1};
}
}
printf("%d\n", cnt);
for (int i = 1; i <= cnt;i++)
printf("%d %d\n", ans[i].first, ans[i].second);
}
总结
高情商:吃了知识面的亏
(低情商:实力太菜,题做少了)
学到了基数排序的基本思想。