社区讨论
求助万能谷民
灌水区参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m237zc1m
- 此快照首次捕获于
- 2024/10/10 19:32 去年
- 此快照最后确认于
- 2025/11/04 17:30 4 个月前
因为题库里没找到此题,就直接给题了
描述
卡卡西的班主任鸣人老师在教学管理方面有自己的一套独特的方法。就比如,同样是安排座位,他们班级的做法就非常与众不同。具体做法是这样的:班级的n个同学按照序号依次将自己期望的同桌序号写在纸上,统一交由鸣人老师。鸣人老师进行统计,按照得票数从高到低的顺序,先安排得票高的同学的同桌,如果该同桌未被安排,则安排给对应同学,如果已经被安排了,则按照序号从头挑选没有安排同桌的同学。
输入
2行,第一行班级人数n,第二行按照序号依次给出每一个同学期望的同桌的序号。
输出
n行,每行两个数字,中间用空格隔开,第一个数是序号,第二个数是该序号同学同桌的序号。
输入样例 1
8
3 3 4 6 6 8 2 3
输出样例1
1 2
2 1
3 4
4 3
5 7
6 8
7 5
8 6
提示
样例解释:
有3个人想跟3号坐,3号第一个选择,选择4号;有2个人想跟6号坐,6号第二个选择,选择8号;有1个人想跟2号坐,2号第三个选择,因为3号已经被选择,所以2号只能选择1号;余下5号和7号正好同桌。
数据范围:
n是偶数,且4<=n<=50。
说明:
如果两人得票数一样,序号小的人先选。
代码~
CPP#include<bits/stdc++.h>
using namespace std;
struct node{//学生情况
int ps;// 学生票数
int x;//此学生的梦想同桌
int ture=0;//此学生的残酷现实
int c;//学生编号
}t[100010];
bool cmp(node a,node b){//结构体排序函数
return a.ps>b.ps;
}
int n;
int s[100];
int main(){
//freopen("0.in","r",stdin);
//freopen("0.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];//输入i号学生的梦想同桌
t[i].x=s[i];//存储i号学生的梦想同桌
t[s[i]].ps++;//存储票数
t[i].c=i;//存取编号
}
sort(t,t+n,cmp);//结构体排序
for(int i=1;i<=n;i++){
if(t[t[i].x].ture==0&&t[i].ture==0){//该同学的梦想同桌没被选且自己没被选
t[i].ture=t[i].x;
t[t[i].x].ture=i;
//成为同桌
}else if(t[t[i].x].ture!=0){//如果被选了,按题目操作
for(int j=1;j<=n;j++){//枚举学生
if(t[j].ture==0&&j!=i){//若没备选(不是单人单桌)
t[i].ture=j;
t[j].ture=i;
//残酷现实
break;
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){//为了按顺序输出,所以加了一个循环(虽然没啥用,输出还是错的)
if(t[j].c==i){//不能乱输出
cout<<i<<" "<<t[j].ture<<endl;//输出学生编号和残酷现实
}
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...