こんな難しい問題、M野先生の授業でもやらなかった。
いや、やったかな・・・?
普段Aレベルアップメニューを解いていますが、それでも相当難しかったです。
C問題ってこんな難しかったでしたっけ。
参考になるかどうか、コードを置いておきます。
軽い気持ちではじめたのに思ったより大変。

<?php
// 自分の得意な言語で
// Let's チャレンジ!!
/*
1 行目には A グループ、 B グループ、 C グループのそれぞれの人数 p , q , r が半角スペース区切りで与えられます。
2 行目から (p + 1) 行目までは A グループの人の番号と
その人が仕事を頼む B グループの人の番号 i_a, j_a (1 ≤ a ≤ p) が半角スペース区切りで、
(p + 2) 行目から (p + q + 2) 行目までは B グループの人の番号と
その人が仕事を頼む C グループの人の番号 j’_b , k_b (1 ≤ b ≤ q) が半角スペース区切りで与えられます。
*/
$s = explode(" ",trim(fgets(STDIN)));
$a_num = $s[0];
$b_num = $s[1];
$c_num = $s[2];
//group aについて
for ($i = 0; $i < $a_num; $i++) {
$t = explode(" ",trim(fgets(STDIN)));
$group_a[] = array("no"=>$t[0], "to_work_b"=>$t[1]);
}
//print_r($group_a);
//group bについて
for ($i = 0; $i < $b_num; $i++) {
$r = explode(" ",trim(fgets(STDIN)));
$group_b[] = array("no" => $r[0], "to_work_c" => $r[1]);
}
//print_r($group_b);
//aが頼むbがもっているcの情報を得る
for ($i = 0; $i < $a_num; $i++) {
for ($j = 0; $j < $b_num; $j++) {
if($group_a[$i]["to_work_b"] == $group_b[$j]["no"]){
$group_a[$i]["to_work_c"] = $group_b[$j]["to_work_c"];
}
}
}
//print_r($group_a);
// 列方向の配列を得る
foreach ($group_a as $key => $row) {
$array_no[$key] = $row['no'];
}
array_multisort($array_no, SORT_ASC, $group_a);//group_aのno.でソート
//print_r($group_a);
for ($i = 0; $i < $a_num; $i++) {
echo($group_a[$i]["no"]." ".$group_a[$i]["to_work_c"]."\n");
}
?>
配列group_aなどのキーを「no」(no.のつもり)と付けてしまったので
まぎらわしくなってしまったかも。
今思えば「id」とかのほうが良かったですね。
変数名はいつも悩みどころです。
参考元:array_multisort 関数
http://yantona.jugem.jp/?eid=334
この記事の問題があるページはこちら
paiza Cランクレベルアップメニュー php編
https://paiza.jp/works/mondai/c_rank_level_up_problems/problem_index?language_uid=php
2+