@致“真香”“各种打脸”的小伙伴们嘤嘤嘤
(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;
}