トピック 1. 関係の推移的な終結を求める
入力
関係行列を一度に入力し、各行の隣接する 2 つの要素はスペースで区切り、入力要素の行と列はそれぞれ関係行列の行と列に対応します。リレーションシップのカーディナリティは 12 未満です。
出力
関係の推移閉包に対応する関係行列を出力します。
注意点: while (scanf("%d",&a)!=EOF) を使用できます
テスト入力 期待される出力 制限時間 メモリ制限 余分なプロセス テスト ケース 1 テキストとして表示
- 0 1 0 0↵
- 1 0 1 0↵
- 0 0 0 1↵
- 0 1 0 0↵
テキストとして表示
- 1 1 1 1↵
- 1 1 1 1↵
- 1 1 1 1↵
- 1 1 1 1↵
1秒 64M 0
-> この質問は Warshell アルゴリズムに関するものです
#include<bits/stdc++.h>
using namespace std;
int Matrix[144];
int main(){
int n=0, a;
while ( scanf("%d",&a)!=EOF ) {
Matrix[n] = a;
n++;
}
a = sqrt(n);
for(int k=0;k<a;k++){
for(int i=0;i<a;i++){
for(int j=0;j<a;j++){
if(Matrix[i*a+j]!=1)
Matrix[i*a+j]=Matrix[i*a+k]&Matrix[k*a+j];
}
}
}
for (int i=0; i<a; i++) {
for (int j=0; j<a; j++) {
if (j==0) printf("%d",Matrix[i*a+j]);
else printf(" %d",Matrix[i*a+j]);
}
printf("\n");
}
return 0;
}
トピック 2. 部分順序集合の最大要素と最小要素を見つける
入力
半順序集合 <A, ≤> を入力. A の要素数は 20 を超えず、英小文字 1 文字で表されます。
入力の最初の行は、2 つの隣接する要素をコンマで区切って、A の個々の要素を示します。
入力の 2 行目は、<a,b>,< c のように、半順序関係 ≤ を順序対の形式で与えます (ハース図のカバレッジを満たす 2 つの要素によって形成される順序対のみが与えられます)。 、a> など、隣接する 2 つの順序付きペアはコンマで区切られます。
出力
A の最小要素と最大要素を出力します。
出力の最初の行は、各最小要素を示し、隣接する 2 つの要素はコンマで区切られます.出力要素は、英字の自然な順序で配置する必要があります.
出力の 2 行目は各最大要素を示し、隣接する 2 つの要素はカンマで区切られ、出力要素は英字の自然な順序で出力する必要があります。
テスト入力 期待される出力 制限時間 メモリ制限 余分なプロセス テスト ケース 1 テキストとして表示
- a,b,c,d↵
- <a,b>,<c,d>↵
テキストとして表示
- a,c↵
- b,d↵
1秒 64M 0
各要素について、そのプレフィックスとサフィックスを数えます。プレフィックス番号が 0 の場合は最小値であることを示し、サフィックス番号が 0 の場合は最大値であることを示します。
#include<bits/stdc++.h>
using namespace std;
struct ch {
char name;
int before=0, after=0;
};
ch character[20];
int main(){
string str;
cin >> str;
for (int i=0; i<=str.length(); i+=2) {
character[i/2].name = str[i];
}
int n = (str.length()+1)/2;
cin >> str;
for (int i=0; i<=str.length(); i+=6) {
for (int j=0; j<n; j++) {
if (str[i+1]==character[j].name) {
character[j].after++;
break;
}
}
for (int j=0; j<n; j++) {
if (str[i+3]==character[j].name) {
character[j].before++;
break;
}
}
}
int k=0;
for (int i=0; i<n; i++) {
if (character[i].before==0) {
if (k==0) {
printf("%c",character[i].name);
k=1;
}
else {
printf(",%c",character[i].name);
}
}
}
printf("\n");
k=0;
for (int i=0; i<n; i++) {
if (character[i].after==0) {
if (k==0) {
printf("%c",character[i].name);
k=1;
}
else {
printf(",%c",character[i].name);
}
}
}
printf("\n");
return 0;
}
これらの 2 つの質問は非常に簡単です。時間を無駄にしないでください。