题目描述 Description
卡卡西的班主任鸣人老师在教学管理方面有自己的一套独特的方法。就比如,同样是安排座位,他们班级的做法就非常与众不同。具体做法是这样的:班级的n个同学按照序号依次将自己期望的同桌序号写在纸上,统一交由鸣人老师。鸣人老师进行统计,按照得票数从高到低的顺序,先安排得票高的同学的同桌,如果该同桌未被安排,则安排给对应同学,如果已经被安排了,则按照序号从头挑选没有安排同桌的同学。
输入描述 Input Description
2行,第一行班级人数n,第二行按照序号依次给出每一个同学期望的同桌的序号。
输出描述 Output Description
n行,每行两个数字,中间用空格隔开,第一个数是序号,第二个数是该序号同学同桌的序号。
样例输入 Sample Input
8
3 3 4 6 6 8 2 3
样例输出 Sample Output
1 2
2 1
3 4
4 3
5 7
6 8
7 5
8 6
数据范围及提示 Data Size & Hint
样例解释:
有3个人想跟3号坐,3号第一个选择,选择4号;有2个人想跟6号坐,6号第二个选择,选择8号;有1个人想跟2号坐,2号第三个选择,因为3号已经被选择,所以2号只能选择1号;余下5号和7号正好同桌。
数据范围:
n是偶数,且4<=n<=50。
说明:
如果两人得票数一样,序号小的人先选。
本人样例不过垃圾代码(c++):
#include <iostream>
#include <algorithm>
using namespace std;
int n, t[80005], flag[55];
struct stu{
int wd, id, p;
}a[55];
bool cmp(stu x, stu y) {
if(x.p!=y.p) return x.p>y.p;
return x.id<y.id;
}
bool cmp1(stu x, stu y) {
return x.id < y.id;
}
int main() {
cin >> n;
for(int i=1; i<=n; i++) {
cin >> a[i].wd;
t[a[i].wd] ++;
a[i].id = i;
}
for(int i=1; i<=n; i++) {
a[i].p = t[a[i].id];
}
sort(a+1, a+n+1, cmp);
for(int i=1; i<=n; i++) {
if(flag[i] != 1) {
//直接可以选择同学想要的同桌
flag[i] = 1;
}
}
for(int i=1; i<=n; i++) {
if(flag[i] != 1)/*剩余的人*/{
for(int j=1; j<=n; j++) {
if(flag[j] != 1) {
a[i].wd = a[j].id;
a[j].wd = a[i].id;
flag[i] = flag[j] = 1;
break;
}
}
}
}
sort(a+1, a+n+1, cmp1);
for(int i=1; i<=n; i++) {
cout << a[i].id << " " << a[i].wd << endl;
}
return 0;
}
求各路大神帮本蒟蒻看一下谢谢
md这类题我最烦