[伯俊]2458号キー順序
[伯俊]2458号基序
1.質問
1番からN番まで番号が貼られていた生徒について、2人の生徒の身長を比較し、結果の一部を得た.しかし、N人とも身長が異なると仮定する.例えば、6人の生徒に対して身長を6回しか比較しなかった結果、以下のようになった.
1番は5番より低く、5番は4番より低いので、1番は4番より低いです.では、1番、3番、5番はいずれも4番未満です.また、4番が2番と6番より小さいので、4番には自分より小さい学生が3人、自分より大きい学生が2人いて、自分の身長が何位なのか正確に知ることができます.しかし、4番以外の生徒たちは自分の身長がどれくらいなのか分からない.
学生の身長を比較するときは、自分の身長を知っている学生が何人いるかを計算し、プログラムを書いてください.
2.入力
1行目は、生徒数N(2<=N<=500)と、2人の生徒の身長を比較した回数M(0<=M<=N(N−1)/2)を与える.次のM行は、2つの整数aおよびbを与え、2人の学生の身長を比較した結果を表す.これは、a番の学生がb番の学生より低いことを意味する.
3.出力
自分の身長がどれくらい分かる学生が何人いるかを印刷します.
4.解答
INF
鍵の順序を優先して入力します.INF
となると、順番がわからない生徒です.INF
余剰生徒数が出力されない.5.最初のコードと異なる点
i==j
の場合はゼロではなく、同様にINF
に初期化されているため、INFを保有している.i!=j && graph[i][j] == INF
条件式改訂6.コード
#include <iostream>
#include <algorithm>
#define INF 1e9
using namespace std;
int graph[501][501];
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int number_of_students, number_of_operation;
cin >> number_of_students>>number_of_operation;
for (int i = 1; i <= number_of_students; i++){
for (int j = 1; j <= number_of_students; j++) {
graph[i][j] = INF;
}
}
for (int i = 0; i < number_of_operation; i++){
int taller, smaller;
cin >> taller >> smaller;
graph[taller][smaller] = 1;
graph[smaller][taller] = -1;
}
for (int k = 1; k <= number_of_students; k++){
for (int i = 1; i <= number_of_students; i++) {
for (int j = 1; j <= number_of_students; j++) {
if (graph[i][j] == INF) {
if (graph[i][k] == 1 && graph[k][j] == 1) graph[i][j] = 1;
if (graph[i][k] == -1 && graph[k][j] == -1) graph[i][j] = -1;
}
}
}
}
int answer = 0;
for (int i = 1; i <= number_of_students; i++){
bool has_INF = false;
for (int j = 1; j <= number_of_students; j++) {
if (i!=j && graph[i][j] == INF) {
has_INF = true;
break;
}
}
answer += has_INF ? 0 : 1;
}
cout << answer;
}
Reference
この問題について([伯俊]2458号キー順序), 我々は、より多くの情報をここで見つけました https://velog.io/@e7838752/boj2458テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol