ジェイミーの連絡先グループ
制限時間: 7000MS | メモリの制限: 65536kも | |
合計の提出: 9227 | 受け入れ: 3180 |
説明
ジェイミーは、非常に人気のある女の子ですし、友人のかなり多くを持っているので、彼女はいつも彼女の携帯電話に非常に長い連絡先リストを保持します。連絡先リストは、彼女が友人の番号を見つけるために、リスト全体を閲覧することが頻繁に長い時間がかかるほど長くなっています。ジェイミーの親友とプログラミングの天才として、あなたは彼女のグループ間の友人の番号を検索するのが容易になりますように、彼女はグループのコンタクトリストとは、最大のグループのサイズを最小化することを示唆しています。ジェイミーはあなたのアドバイスを取り、あなたは彼女の友人の名前を含む彼女の全体の連絡先リスト、彼女が持っていると、すべての友人が何にグループに属する可能性が希望するグループの数を示します。
入力
最大20のテストケースがあります。容易ケースNは、コンタクトリストの長さであり、Mは、グループの数であり、二つの整数N及びMを含む行から始まります。Nラインが、その後に従ってください。各行には、友人の名前が含まれており、グループは、友人はに属している可能性があります。あなたは、Nが1000以上のものではありませんし、Mは、これ以上の500以上の名前が唯一のアルファベット文字を含んでいないだろうし、もはや15文字を超えることになるであると仮定することができます。いいえ二人の友人は、同じ名前を持っていません。グループラベルが0とMとの間の整数である - 最後のテストケースの後1、入力を終了一行 '0' があります。
出力
各テストケースのために、出力単一の整数、最大のコンタクトグループのサイズを含む行。
サンプル入力
3 2 ジョン・0 1 ローズ1 メアリー1 5 4 ACM 1 2 3 ICPC 0 1 アジア0 2 3 地域1 2 上海0 2 0 0
サンプル出力
2 2
ソース
この問題は、しばらくの間、行う必要があり、彼は私がオーバーと一致するようにコードを変更することが古い感じ......それは明らかに半分ですが、すべての一致のための最大需要後の最小パケットを一致させることですが、それを手綱する方法を、最小グループの上限は、その後、我々は条件を判断によって制約することができるように、要求の対象として:...そして最も致命的では私自身のテストの答えは、すべての訓練を受け、訓練を受け、訓練を受けた、私の最初の考えを持っていたあります私たちは人々のマッチングセットを発見していない場合は、1が最低、そうでない場合は、最初に一致しなければなりません直接一致するので、その後、他の人に合うように、彼は試合を手放すことを、ルールに一致することは、まだケースですが、ノードがあれば、我々はできませんので、すべてのグループがこのノードに接続されていることを意味し、上記の事情を満たす他の誰かによってマッチされている、それに合わせて、その最初の直接選挙が、ここでの問題はありませんこれは確かに最小値に加算されますので、試合後に最小が誰であるかを決定するために最初の試合は、.soが半分答え下記の解答には影響しません。
二値の答え:
バイナリ答え、上限を変更することができる場合は、チェックが一致するように各完全一致、その後、変更のR、Lまたは変更して、[OK。出力半ば。
1 / * *********************************************** ************************* 2 >ファイル名:POJ-2289.jamies_contact_groups.cpp 3 >著者:CruelKing 4 >メール:QQ @ 2016586625。 COM 5 >作成日時:2019年09月03日星期二21时09分58秒 6 ****************************** ***************************************** * / 7 / * 8 の#include <入出力ストリーム> 9 の#include <sstream提供さ> 10 の#include <ストリング> 11 の#include <CStringの> 12 名前空間STDを使用して、 13 14 CONST INT MAXN = 1000 + 5、MAXM = 500 + 5、INF = 0x3f3f3f3f。 15 16 のint N、M。 17 文字列str; 18 文字名[20]。 19 INTリンカー[MAXM] [MAXN]。 20 BOOL使用[MAXM]、G [MAXN] [MAXM]。 21の 22 ブールDFS(INT U){ 23 のための(int型V = 0; V <M、V ++){ 24 IF(!G [U] [V] &&使用[V]){ 25 使用[V] =真; 26 IF(リンカー[V] [0] == 0){ 27 リンカー[V] [++リンカー[V] [0] = U。 28 真のリターン。 29 } 30 以下のために(INT I = 1; I <=リンカー[V] [0]; iは++){ 31 IF(DFS(リンカー[V] [I])){ 32 リンカー[V] [I] = U。 33 真のリターン。 34 } 35 } 36 リンカー[V] [++リンカー[V] [0] = U。 37 真のリターン。 38 } 39 } 40 偽リターン。 41 } 42 43 INTメイン(){ 44 ながら(CIN >> N >> M &&(N || M)){ 45 のmemset(G、偽、はsizeofのG)。 46 用(INT i = 0; iがn <; Iは++){ 47 CIN >>名。 48 のgetline(CIN、STR)。 49 にstringstream ssの。 50の SS << STR。 51 INT X。 52 一方(SS >> X) 53 G [i]が[X] =真。 54 } 55 INT RES = 0。 56 (;私がm <; I = 0をint型I ++)はリンカー[I] [0] = 0。 57 {(; iがN <I ++は、I = 0をINT)のための 58 (使用sizeofは、偽、使用)のmemset。 59 (DFS(I))のres ++であれば、 60 } 61 INT M = 0。 62 のために(0 = I int型、iがmを<; iは++){ 63 IF(M <リンカー[I] [0])M =リンカー[I] [0]。 64 } 65 COUT << M << ENDL。 66 } 67 リターン0。 68 } 69 * / 70の#include <iostreamの> 71の#include <sstream提供さ> 72の#include < ストリング > 73の#include <CStringの> 74 の#define半ば((L + R)>> 1) 75 使用 名前空間STDを、 76 77 のconst INT MAXN = 千 + 5、MAXM = 500 + 5、INF = 0x3f3f3f3f 。 78 79 のint N、M、L、R。 80 文字列strの。 81 チャー名[ 20 ]。 82 int型リンカー[MAXM] [MAXN]。 83 BOOL 使用[MAXM]、G [MAXN] [MAXM]。 84の 85 ブール DFS(INT U){ 86 のための(int型 V = 0 ; V <M、V ++ ){ 87 であれば(G [U] [V] &&![V])を用い{ 88 使用[V] = 真。 89 であれば(リンカー[V] [ 0 ] < MID){ 90 リンカー[V] [++リンカー[V] [ 0 ] = U。 91 リターン 真。 92 } 93 のための(int型 i = 1 ; iは=半ばを<; iは++ ){ 94 であれば(DFS(リンカー[V] [I])){ 95 リンカー[V] [I] = U。 96 リターン 真。 97 } 98 } 99 } 100 } 101 戻り 偽。 102 } 103 104 INT のmain(){ 105 ながら(CIN >> N >> M &&(N || M)){ 106 のmemset(G、偽、はsizeofのG)。 107 のための(int型 i = 0 ; iがN <I ++は{) 108 CIN >> 名。 109 のgetline(CIN、STR)。 110の にstringstream SS。 111の SS <<STR; 112 INT X。 113 一方(SS >> X) 114 G [i]が[X] = 真。 115 } 116 / * 117 INT RES = 0。 118 L = 0、R = MAXN << 1。 119 のための(I 0 = int型;私がm <; I ++)は、リンカー[I] [0] = 0。 120 のための(I 0 = int型、iがN <; Iは++){ 121 (使用sizeofは、偽、使用)のmemset。 122 (DFS(I))RES ++場合。 123 } 124 COUT << RES << ENDL。 125 * / 126 、L =0、R = N。 127 int型のres; 128 一方(L <= r)は{ 129 のRES = 0 。 130 のための(int型 iは= 0 ;私がm <; I ++)は、リンカー[I] [ 0 ] = 0 。 131 のための(int型 iは= 0 ; iがN <; Iは++ ){ 132 (使用のmemset 偽、sizeofは使用されます)。 133 であれば(DFS(I))RES ++ 。 134 } 135 もし(N == RES)R =ミッド- 1 。 136 他 L =ミッド+ 1 。 137 } 138 COUT <<中間+ 1 << ENDL。 139 } 140 戻り 0 ; 141 }