GCJに向けて本気で問題を解説してみる 第3回 (When Can We Meet?)

第3回はAOJにジャッジがないので少し飛びまして「When Can We Meet?」を解説したいと思います。いつものように参考ページは

「ACM/ICPC国内予選突破の手引き」
「AOJの問題ページ」

になります。


さてこの問題はどういう問題かといいますと、

  • ある会議を行うために複数人の人が集まれるもっともよい日を調整する
  • 会議の構成メンバー数Nと必要最低出席者数Qが与えられる
  • 会議は今日から100日後までに行われる

というものです。

会議が100日以内に行われることが分かっているので、長さ50の配列を用意して、各人の都合の良い日程を数えていけばよいことになります。唯一注意すべき点は必要最低出席者数に満たない場合には会議が行えず0を返さなくてはならない点です。そこにさえ注意すれば恐るるに足らない問題でしょう。


#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <algorithm>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <queue>
#include <string>
using namespace std;

#define rep(i,n) for(int i=0; i<n; i++)
#define repa(i,s,e) for(int i=s; i<=e; i++)
#define repd(i,s,e) for(int i=s; i>=e; i--)

typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int, int> pii;

int N, Q, M, D;
int S[101];

int main() {
    while(cin>>N>>Q, N|Q) {
        fill(S, S+101, 0);
        rep(i,N) {
            cin >> M;
            rep(j,M) {
                cin >> D;
                S[D]++;
            }
        }

        int m = Q-1;
        int d = 0;
        rep(i,101) {
            if(S[i] > m) {
                d = i;
                m = S[i];
            }
        }
        cout << d << endl;
    }
}