PTA-团体天梯赛-L1-049 天梯赛座位分配 (20 分)

@致“真香”“各种打脸”的小伙伴们嘤嘤嘤

(2020.11.24修改,发现有错误,PTA测试数据还是不太行,测试的时候发现原先的代码有问题)
时隔不久我又发博客啦~~~
这次我想废话几句嘛,这次做这道座位分配的题目我是真的各种打脸啊(脸都肿了QAQ),difficult还是在的嘛,level也还是在的嘛,实践告诉我们不要随便瞎说话!!!说话之前要经过大脑的思考!!!所以写一篇博客来纪念一下啦~

题目精简描述:本题要求我们根据已知的学校数量和各个学校的队伍数量进行座位的分配
注意题目的重点要求:同一所学校的所有队员不能相邻~~~

我第一眼看到这个题目的时候没啥思路:稍加思索,总结出这几个方面:
1.设定数组的意义何在:这里我设定了两个数组:
一个数组team表示每所高校的参赛人数,一个数组Number表示每位参赛选手的座位号。
重点来了!!!
Number数组的下标代表的是每位参赛选手的座位号,而其数组中储存的信息是每位参赛选手的所属学校,也就是说假如有n所学校,那么Number数组中的值就是1~n依次循环下去

2.还有一个需要注意的方面是如果我们遇到某一所参赛人数最多,学校编号记为n,第二多的参赛人数的学校编号为m,如果此时m > n,那么编排参赛队伍最多的最后一支队伍的第一位选手不需要隔位就坐,因为在他的前面一个选手并不是与他同一所学校的选手,所以我就搞了一个结构体,sort一下找出最多和第二多的学校编号

3.最后一点需要注意的是打印时:我们打印的是Number数组的下标!!!那些什么换行啊打印空格啊太平常的问题这里我就不说啦~那是pta的日常~嘤嘤嘤

代码部分:

#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e4 + 10;
typedef long long ll;

struct node
{
	int t;
	int num;
}b[N];

int n;
int m[N];
int a[N];
int sum;
int maxx, premaxx;

bool cmp(node x, node y)
{
	if (x.t == y.t)
	{
		return x.num > y.num;
	}
	return x.t > y.t;
}

int main()
{
	cin >> n;
	int z = 0;
	for (int i = 1; i <= n; i++)
	{
		cin >> m[i];
		b[i].num = i;
		b[i].t = m[i];
		m[i] = m[i] * 10;
	}
	sort(b + 1, b + n + 1, cmp);
	maxx = b[1].num;
	premaxx = b[2].num;
	int cnt = 1;
	int flag = 0;
	while (1)
	{
		for (int i = 1; i <= n; i++)
		{
			if (m[i] > 0)
			{
				a[cnt++] = i;
				m[i]--;
			}
		}
		int t = n;
		for (int i = 1; i <= n; i++)
		{
			if (!m[i])
			{
				t--;
			}
		}
		if (!t)
		{
			break;
		}
		if (t == 1)
		{
			cnt++;
		}
		if (n != 1 && t == 1 && !flag && premaxx > maxx)
		{
			cnt--;
			flag = 1;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		cout << "#" << i << endl;
		int flag = 0;
		int k = 1;
		for (int j = 1; j < cnt; j++)
		{
			if (a[j] == i)
			{
				if (flag)
				{
					cout << " ";
				}
				flag = 1;
				cout << j;
				if (!(k % 10))
				{
					flag = 0;
					cout << endl;
				}
				k++;
			}
		}
	}
	return 0;
} 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娃娃酱斯密酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值