绝世好水的题

Posted by yjjr's blog on February 6, 2018

标签:模拟

题目描述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
说明:
如果两人得票数一样,序号小的人先选。


分析:绝世好水的题,娱乐大众23333,教练竟然怀疑是二分图匹配(笑)

实际上是小学组题目

code

#include<bits/stdc++.h>
using namespace std;
struct node{int want,rate,id,ans;}x[56];//want表示期望和某人坐同桌,rate表示受欢迎程度,id表示读入时的序号,ans表示最终答案和谁坐同桌 
int n;
bool cmp1(node a,node b){return a.rate==b.rate?a.id<b.id:a.rate>b.rate;}
bool cmp2(node a,node b){return a.id<b.id;}
 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
	    cin>>x[i].want;
		x[x[i].want].rate++;
		x[i].id=i;
	}
	sort(x+1,x+1+n,cmp1);//按受欢迎程度排序 
	for(int i=1;i<=n;i++){
		if(x[i].ans>0)continue;//如果这个人已经有同桌了,就跳过 
		int flag=0;
		for(int j=1;j<=n;j++)
			if(x[j].id==x[i].want){//寻找期望中的同桌 
				if(x[j].ans==0){//如果期望中的同桌还未匹配,那么就与其匹配 
					x[j].ans=x[i].id;
					x[i].ans=x[i].want;
					break;
				}
				flag=1;//如果期望中的同桌被其他人匹配过了,那么打上标记 
			}
		if(flag==1)//期望中的同桌被其他人匹配过了,重新找为匹配的同桌 
			for(int j=i+1;j<=n;j++)//前i-1个人肯定都已匹配完毕,从第i+1个人开始找 
                if(x[j].ans==0){
                    x[j].ans=x[i].id;
                    x[i].ans=x[j].id; 
                    break;
                }  
	}
	sort(x+1,x+1+n,cmp2);//按读入的id值重新排序输出 
	for(int i=1;i<=n;i++)cout<<x[i].id<<' '<<x[i].ans<<endl;
	return 0;
}



本文可以转载,但必须附上原文链接,否则你会终生找不到妹子!!!欢迎关注我的CSDN: ahyjjr