YTU OJ 3301: 喵喵的Logo
阿新 • • 發佈:2018-12-17
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; }