teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2021/11/19 09:49

投稿

fana
fana

スコア12220

answer CHANGED
@@ -119,4 +119,35 @@
119
119
  printf( "%s : %d\n", Survivors[0]->name, Survivors[0]->age );
120
120
  return 0;
121
121
  }
122
+ ```
123
+
124
+ [さらに追記]
125
+ 老人が若い奴を蹴落としていくやり方をするなら,
126
+ 「平均年齢より低い人はお帰り下さい」みたいなルールで一度にごっそりと脱落者を出していく方が話が早いな.
127
+ ↑のwhile以降の部分を以下のように変えればいいかな.
128
+
129
+ ```C
130
+ while( 1 )
131
+ {
132
+ int Sum = 0;
133
+ for( int i=0; i<nSurvivors; ++i ){ Sum += Survivors[i]->age; }
134
+
135
+ int n = nSurvivors;
136
+ for( int i=0; i<n; /*NOP*/ )
137
+ {
138
+ if( nSurvivors * Survivors[i]->age < Sum )
139
+ {
140
+ Survivors[ i ] = Survivors[ n-1 ];
141
+ --n;
142
+ }
143
+ else
144
+ { ++i; }
145
+ }
146
+ if( n == nSurvivors )break;
147
+ nSurvivors = n;
148
+ }
149
+
150
+ //結果表示
151
+ for( int i=0; i<nSurvivors; ++i )
152
+ { printf( "%s : %d\n", Survivors[i]->name, Survivors[i]->age ); }
122
153
  ```

1

別のを追記

2021/11/19 09:49

投稿

fana
fana

スコア12220

answer CHANGED
@@ -57,4 +57,66 @@
57
57
  printf( "%s : %d\n", P[18]->name, P[18]->age );
58
58
  return 0;
59
59
  }
60
+ ```
61
+
62
+ ---
63
+
64
+ [追記]
65
+ あるいは,こんなのでも良いかもしれない.
66
+
67
+ * 各々が,自身よりも若い者のいずれか1人を指し示す(対象がいない場合は何もしない)
68
+ * 最も指し示された人は退場する(全員の指し示された数が0回だろうが,とにかく誰かを退場させる)
69
+
70
+ というのを,最後の1人になるまで繰り返す.
71
+
72
+ ```C
73
+ int main(void)
74
+ {
75
+ //※入力部は省略
76
+ const Students data[10] = {
77
+ {"A",5}, {"B",38}, {"C",8}, {"D",6}, {"E",1},
78
+ {"F",16}, {"G",4}, {"H",7}, {"I",0}, {"J",3}
79
+ };
80
+
81
+ //初期状態:最初は10人全員
82
+ int nSurvivors = 10;
83
+ const Students *Survivors[10] = { 0 };
84
+ for( int i=0; i<10; ++i ){ Survivors[i] = data+i; }
85
+
86
+ //残り1人になるまで追放審議会を繰り返す.
87
+ while( nSurvivors > 1 )
88
+ {
89
+ //各々が追放したい1人に投票する(ただし,自身より若い奴にしか投票しない)
90
+ int VotingSpace[10] = { 0 };
91
+ for( int i=0; i<nSurvivors; ++i )
92
+ {
93
+ //てきとーに自分りも若い奴を1人見つけて,そいつに投票する
94
+ for( int j=0; j<nSurvivors; ++j )
95
+ {
96
+ if( Survivors[i]->age > Survivors[j]->age )
97
+ {
98
+ VotingSpace[j]++;
99
+ break;
100
+ }
101
+ }
102
+ }
103
+ //最も票が多かった人は追放です
104
+ int iMaxVote = 0;
105
+ int MaxVote = VotingSpace[0];
106
+ for( int i=1; i<nSurvivors; ++i )
107
+ {
108
+ if( MaxVote < VotingSpace[i] )
109
+ {
110
+ iMaxVote = i;
111
+ MaxVote = VotingSpace[i];
112
+ }
113
+ }
114
+ Survivors[ iMaxVote ] = Survivors[ nSurvivors-1 ];
115
+ --nSurvivors;
116
+ }
117
+
118
+ //結果表示
119
+ printf( "%s : %d\n", Survivors[0]->name, Survivors[0]->age );
120
+ return 0;
121
+ }
60
122
  ```