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;
}