社区讨论

求助万能谷民

灌水区参与者 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 条回复,欢迎继续交流。

正在加载回复...