求助万能谷民
  • 板块灌水区
  • 楼主Aric111
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/10 19:32
  • 上次更新2024/10/10 21:29:00
查看原帖
求助万能谷民
1411161
Aric111楼主2024/10/10 19:32

因为题库里没找到此题,就直接给题了

描述 卡卡西的班主任鸣人老师在教学管理方面有自己的一套独特的方法。就比如,同样是安排座位,他们班级的做法就非常与众不同。具体做法是这样的:班级的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。

说明:

如果两人得票数一样,序号小的人先选。

代码~

#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;
}
2024/10/10 19:32
加载中...