2021AutoX安途杯中山大学程序设计校赛 G Stack Sort I(基数排序)

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);
}

总结

高情商:吃了知识面的亏
(低情商:实力太菜,题做少了)

学到了基数排序的基本思想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值