Problem:
Problem A: Popularity Estimation
あなたはとあるアニメーション制作会社の企画部長である。昨今のアニメーション制作会社が制作するものは、アニメーションそのものにとどまらない。関連商品、例えば登場キャラクターのフィギュアやキャラクターソングCDなども、重要な収益源なのである。この収益をどれだけ伸ばせるかは、ひとえに企画部長のあなたにかかっているのであった。
当たり前のことだが、こういった関連商品は闇雲に発売すればいいというものではない。商品の開発には多くの時間と予算が必要なためだ。アニメの登場キャラクターのフィギュアを発売するにしても、多くの売上が見込まれる、人気があるキャラクターのものに限らなければならない。
キャラクターの人気度を測る手段の一つが、人気投票である。あなたも今までいくつかの人気投票を企画してきたが、どうやら視聴者はこの企画に不満を抱きつつあるようだ。人気度を測る他の手法の確立が急務である。
そこであなたは、ひとつの仮説を立てた。あるキャラクターの人気度は、そのアニメ本編中における登場時間の総和に比例する、というものだ。あなたはこの仮説を検証するため、それぞれのキャラクターの登場時間を集計するプログラムを書くことにした。
Input
入力は複数のケースからなる。
各ケースは以下のフォーマットで与えられる。
n
name
0
m
0
d
0,0
...
d
0,m
0
-1
name
1
m
1
d
1,0
...
d
1,m
1
-1
.
.
.
name
n-1
m
n-1
d
n-1,0
...
d
n-1,m
n-1
-1
n
はキャラクターの人数を表す。
name
i
はキャラクターの名前を表す。
m
i
はキャラクターが映っていた時刻の種類を表す。
m
i
の後には
m
i
個の整数
d
i,j
が与えられる。
d
i,j
はキャラクターが映っていた時刻を表す。
入力の終わりは
n=0
からなる行によって与えられる
ある時刻に1人のキャラクターのみが画面に映っていた場合、そのキャラクターはnポイントを得ることが出来る。
同時刻に映るキャラクターが1人増える毎に、その時刻に映っていたキャラクターが得られるポイントは1減る。
n人のキャラクターが同時刻に映っていた場合、n人の人それぞれに1ポイントが加算される。
入力は以下の制約を満たす。
2 ≤
n
≤ 20
0 ≤
m
i
≤ 30
0 ≤
d
i,j
< 30
i
番目のキャラクターについて
d
i,j
はすべて異なる。
name
i
はアルファベットの大文字または小文字のみを含み、長さは10以下である。
Output
最小のポイントを持つキャラクターのポイントとその名前を1つの空白で区切って出力せよ。
最小のポイントを持つキャラクターが複数いる場合は名前が辞書順で最小の人を選ぶこと。
Sample input
4
akzakr 2 1 8
fnmyi 5 2 3 4 6 9
tsnukk 5 2 3 4 7 9
yskwcnt 6 3 4 7 8 9 10
4
akzakr 1 2
fnmyi 3 10 11 12
tsnukk 2 1 8
yskwcnt 2 1 8
5
knmmdk 2 13 19
akmhmr 4 13 15 19 22
mksyk 6 3 7 12 13 15 19
skrkyk 3 1 4 8
tmemm 3 1 17 24
5
knmmdk 5 5 6 16 18 26
akmhmr 9 3 4 7 11 14 15 17 18 20
mksyk 5 6 13 25 27 28
skrkyk 4 3 16 23 24
tmemm 3 6 12 20
14
hrkamm 6 4 6 8 10 20 22
mkhsi 6 1 10 12 15 22 27
hbkgnh 2 4 9
chyksrg 8 3 4 12 15 16 20 25 28
mktkkc 6 0 1 8 15 17 20
tknsj 6 6 8 18 19 25 26
yyitktk 3 3 12 18
ykhhgwr 5 3 9 10 11 24
amftm 7 2 6 8 12 13 14 17
mmftm 4 6 12 16 18
rtkakzk 3 14 15 21
azsmur 7 1 2 4 12 15 18 20
iormns 2 4 20
ktrotns 6 7 12 14 17 20 25
14
hrkamm 2 4 21
mkhsi 6 2 3 8 11 18 20
hbkgnh 4 4 16 28 29
chyksrg 5 0 3 9 17 22
mktkkc 2 7 18
tknsj 3 3 9 23
yyitktk 3 10 13 25
ykhhgwr 2 18 26
amftm 3 13 18 22
mmftm 4 1 20 24 27
rtkakzk 2 1 10
azsmur 5 2 5 10 14 17
iormns 3 9 15 16
ktrotns 5 7 12 16 17 20
0
Sample output
7 akzakr
4 akzakr
6 knmmdk
12 tmemm
19 iormns
24 mktkkc
The University of Aizu Programming Contest 2011 Summer
原案: Tomoya Sakai
問題文: Takashi Tayama

Submitted solutions:

code_snippet: #include<bits/stdc++.h>
#define N 20
#define M 31
using namespace std;
typedef pair<string,int> P;

int n,cnt[M],point[N],k,m,tim,minp;
vector<P> t[N];
string s;

int main(){
  while(1){
    cin>>n;
    if(!n)break;
    for(int i=0;i<M;i++)cnt[i]=0;
    for(int i=0;i<n;i++){
      cin>>s;
      cin>>m;
      for(int j=0;j<m;j++){
	cin>>tim;
	t[i].push_back(P(s,tim));
	cnt[tim]++;
      }
      point[i]=0;
    }
    minp=(1e9);
    sort(t,t+n);
    for(int i=0;i<n;i++){
      for(int j=0;j<t[i].size();j++){
	int idx=t[i][j].second;
	point[i]+=n-cnt[idx]+1;
      }
      minp=min(minp,point[i]);
    }
    vector<string> v;
    for(int i=0;i<n;i++){
      if(minp==point[i]){
	v.push_back(t[i][0].first);
	break;
      }
    }
    sort(v.begin(),v.end());
    cout<<minp<<' '<<v[0]<<endl;
    for(int i=0;i<n;i++)t[i].clear();
  }
  return 0;
}
accuracy: 0.5
time_ms: 10
memory_kb: 1244
final_rank: 2

code_snippet: #include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main(){
  int n;
  while(cin >> n,n){
    map<string,vector<int> > d;
    map<string,vector<int> >::iterator itr;
    for(int i=0;i<n;i++){
      string s; int m; cin >> s >> m;
      for(int j=0;j<m;j++){
	int t; cin >> t;
	d[s].push_back(t);
      }
    }
    int mini = (2 << 20); string name;
    for(itr=d.begin();itr!=d.end();itr++){
      int sum = 0;
      for(int i=0;i<(itr->second).size();i++){
	int cnt = 0;
	for(map<string,vector<int> >::iterator it=d.begin();it!=d.end();it++){
	  if(it == itr) continue;
	  for(int j=0;j<(it->second).size();j++){
	    if((itr->second)[i] == (it->second)[j]) cnt++;
	  }
	}
	sum = sum + (cnt == n ? 1 : (n - cnt));
      }
      if(mini > sum){
	mini = sum; name = itr->first;
      }
    }
    cout << mini << " " << name << endl;
  }
}
accuracy: 0.5
time_ms: 10
memory_kb: 1244
final_rank: 2

code_snippet: #include <iostream>
#include <map>
using namespace std;
typedef pair<string,int>P;
int main(){
  int n;
  while(cin >> n,n){
    int m,point[100];
    map< P, int>ve;
    fill(point,point+31,n+1);
    for(int k = 0 ; k < n ; k++ ){
      string name;
      cin >> name >> m;
      for(int i = 0 ; i < m ; i++ ){
	int a;
	cin >> a;
	ve[P(name,a)]=1;
	point[a]--;   
      }
    }
    map<string,int>ans;
    ans.clear();
    for(map< P,int >::iterator it = ve.begin() ; it != ve.end() ; it++ ){
      for(int j = 0 ; j < 30 ; j++ ){
	if((*it).second == 1 &&
	   point[j] <= n &&
	   (*it).first.second == j)ans[(*it).first.first]+=point[j];
      }
    }
    int mn = 100000000;
    string ansname;   
    for(map<string,int>::iterator it = ans.begin() ; it != ans.end() ; it++ ){
      if(mn > (*it).second){
	mn = (*it).second;
	ansname = (*it).first;
      }
    } 
    cout << mn << ' ' << ansname << endl;
  }
}
accuracy: 0.5
time_ms: 10
memory_kb: 1240
final_rank: 1