YTU OJ 3301: 喵喵的Logo

3301: 喵喵的Logo

 

题目描述

喵喵是一家科技公司的实习程序员。这一天,他的公司正在换新Logo。为了设计他们公司的Logo,公司的卓BOSS花重金请了许多专业设计师设计了许多Logo,喵喵作为一个90后,被委派选出能够代表他们公司的最好Logo,因为年轻人对新鲜有意思的事物十分敏感。 喵喵想了一个民主的方法,所有公司员工组成投票委员会。投票制度有点复杂:每个员工按照顺序最多给三种不同的Logo投一票。每个员工的第一种票、第二种票、第三种票分别代表3分,2分,1分。Logo的最终分数是所有员工投票后的总分数。得分最高的Logo将会被喵喵选用作为公司的Logo。如果最高分数的Logo有多个,那么获得第一种票数多的被选用。如果它们的分数和第一种票数也一样,那么第二种票多的被选用。还有类似的情况,处理情况与上述一样,如果最终还有并列的Logo,则全被选用。作为喵喵的好朋友,你能编出程序帮助他这个新手程序员顺利解决这个问题吗。

输入

输入数据有若干组。每一组第一行有一个正整数n(1<=n<=100)表示该公司的员工总数。
接下来的n行中,每一行开始有一个整数di(1<=di<=3),表示第i的员工选择投票的Logo数
紧接着有di个不同的整数ID,表示Logo的编号(1<=ID<=1e6)。
输入将会以0为结束标志。

 

输出

对于每一组样例,输出最终被选用的Logo的ID。如果有多个Logo被选用,请按照从小到大的顺序输出Logo的ID

样例输入

4
3 5 2 1
3 12 5 2
2 1 2
3 2 1 5
2
3 3 2 1
3 2 3 1
0

样例输出

2
2 3
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int Max = 1e6+5;
using namespace std;
struct vote
{
	int id;
	int x;
	int y;
	int z;
	int sum;
}a[Max];
bool cmp(vote a,vote b)
{
	if(a.sum==b.sum)
	{
		if(a.x==b.x)
		{
			if(a.y==b.y)
			{
				if(a.z==b.z)
				{
					return a.id<b.id;
				}
				return a.z>b.z;
			}
			return a.y>b.y;
		}
		return a.x>b.x;
	}
	return a.sum>b.sum;
}
int main()
{
	int n;
	int i,j,k,l,m;
	int a1,b1,c1;
	int t=0;
	while(cin>>n&&n)
	{
		memset(a,0,sizeof(a));
		while(n--)
		{
			cin>>m;
			if(m==3)
			{
				cin>>a1>>b1>>c1;
				t=max(t,a1);
				t=max(t,b1);
				t=max(t,c1);
				a[a1].id=a1;
				a[b1].id=b1;
				a[c1].id=c1;
				a[a1].x++;
				a[a1].sum+=3;
				a[b1].y++;
				a[b1].sum+=2;
				a[c1].z++;
				a[c1].sum+=1;
			}
			if(m==2)
			{
				cin>>a1>>b1;
				t=max(t,a1);
				t=max(t,b1);
				a[a1].id=a1;
				a[b1].id=b1;
				a[a1].x++;
				a[a1].sum+=3;
				a[b1].y++;
				a[b1].sum+=2;
			}
			if(m==1)
			{
				cin>>a1;
				t=max(t,a1);
				a[a1].id=a1;
				a[a1].x++;
				a[a1].sum+=3;
			}
		}
		sort(a,a+1+t,cmp);
		cout<<a[0].id;
		i=1;
		while(a[i].sum==a[0].sum&&a[i].x==a[0].x&&a[i].y==a[0].y&&a[i].z==a[0].z)
		{
			cout<<" "<<a[i].id;
			i++;
		}
		cout<<endl;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loganer

感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值