1065シングル犬
「シングル犬は、」一人のための愛情の中国の用語です。この質問は、あなたは特別な注意を与えるために何千人もの人々の単一の大規模なパーティーからのゲストを見つけます。
入力フォーマット:
最初の行の入力は正の整数N(与えられ≤50 000)、既知の結合/パートナーの数であり、次いで、N行、各行がカップル/パートナー与えられる-便宜のために、各IDに対応スペースと(00000から99999から)インターIDによって分離された番号、5桁、正の整数M(後に与え≤10 000)、パーティで人の総数は、次にM線はお客様にIDを与え、スペースで区切られています。トピックには重婚や足のボートを保証しません。
出力フォーマット:
まず、ゲストの最初の合計数の単一の出力線と、IDがリストされている順序と単一ゲストにインクリメントされる第二のラインが続きます。パーティションIDとの間のスペース、そして最後の行に余分なスペースを持っていないかもしれません。
サンプル入力:
3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333
出力例:
5
10000 23333 44444 55555 88888
这道题其实并不难,找情侣狗问题,我是开了一个大小为100000的数组pairs存每个人的另一半的编号。
对于参加派对的人,我又开了一个一样大小的bool数组vis来判断人是否出现,默认所有人为false,出现的那个置为true。
我们先把参加宴会的人数m赋值给一个变量num,开始读取并操作参加派对人数。
先开一个用于输出最后结果的output数组读取每个参加派对人员,并开设数组c记录每个实际ID在output数组中的编号。每读取一个ID,我们可以通过pairs数组对该ID对应的另一半ID是否出现进行判断。情侣第一个出现的不会被判断为情侣(因为她(他)的另一半还没出现),但当他(她)另一半出现时,两者会被判定为情侣。然后把num -= 2(注意不能把参加宴会人数减2了,不然无法把所有参加派对的人读入),把output数组中该位以及情侣位的值置为INF(为了排序时可以直接排到后面),情侣在output中的位置可由pairs确定其值,通过c数组查找该值在output中的位置。
次いでNUMの出力値は、出力を必要結果並べ替え、並べ替えの前のmビット出力(参加者の数は、パーティmはないことに注意)、およびNUMビットは前にすることができます。
いいえ、その後、夫婦の除去に加えて、党の前で参加者の数が0の場合 - 出力は、新たな問題につながった、背中最初の出力を分離する必要があり、その後、接頭辞0、およびスペースなしで行の終わりを持っていることに留意すべきです結果出力、私たちは、参加者を裁くべきではありませんは、第1の出力で0です。
ACコード:
書式#include <stdio.hに> する#include <アルゴリズム> 使用して、名前空間STD; の#define INFの1E6の int型のペア[100005]; //は、夫婦の位置を記録 ブールVIS [100005]; //は、パーティのかどうかを決定する int型出力[10005]; //アレイ出力 のint C [100005]; //出力値をIDに対応する配列決定される INTメイン(ボイド) { int型N-、B、M、 scanfの( "%のD"、およびN-); (INT用I = 0、I <N - 、Iは++) { scanfの( "%のDの%のD"、&A、&B); 対[A] = B; 対[B] =; } scanfの( "%のD"、&M)を、 INT NUM = M; // NUMがmに割り当てられた最初除去結合の数、すなわち当事者番号 (; iがm <I ++はINT I = 0)のための { scanfの( "%Dを"、&a)は、 出力[ I] = A、 C [A] = I。 VIS [A] =真。 (VIS [ペア[A]場合 ]は)// カップルを見つける { 出力[I] = INF; OUTPUT [C [対[A]]] = INF; NUM - = 2; //以下の非結合2 } } のprintf( "%Dの\のN-"、NUM)は、 並べ替え(出力、出力+ M); !IF(NUM = 0)//パーティの分析が0かどうかカップルを取り除く ;出力[0])、のprintf( "%05D" (int型I =のために1;。私はNUMを<;私は++) { のprintf ( "%05D"、アウトプット[I]); } 戻り0; }