回答編集履歴

2

追記

2021/11/19 09:49

投稿

fana
fana

スコア11996

test CHANGED
@@ -241,3 +241,65 @@
241
241
  }
242
242
 
243
243
  ```
244
+
245
+
246
+
247
+ [さらに追記]
248
+
249
+ 老人が若い奴を蹴落としていくやり方をするなら,
250
+
251
+ 「平均年齢より低い人はお帰り下さい」みたいなルールで一度にごっそりと脱落者を出していく方が話が早いな.
252
+
253
+ ↑のwhile以降の部分を以下のように変えればいいかな.
254
+
255
+
256
+
257
+ ```C
258
+
259
+ while( 1 )
260
+
261
+ {
262
+
263
+ int Sum = 0;
264
+
265
+ for( int i=0; i<nSurvivors; ++i ){ Sum += Survivors[i]->age; }
266
+
267
+
268
+
269
+ int n = nSurvivors;
270
+
271
+ for( int i=0; i<n; /*NOP*/ )
272
+
273
+ {
274
+
275
+ if( nSurvivors * Survivors[i]->age < Sum )
276
+
277
+ {
278
+
279
+ Survivors[ i ] = Survivors[ n-1 ];
280
+
281
+ --n;
282
+
283
+ }
284
+
285
+ else
286
+
287
+ { ++i; }
288
+
289
+ }
290
+
291
+ if( n == nSurvivors )break;
292
+
293
+ nSurvivors = n;
294
+
295
+ }
296
+
297
+
298
+
299
+ //結果表示
300
+
301
+ for( int i=0; i<nSurvivors; ++i )
302
+
303
+ { printf( "%s : %d\n", Survivors[i]->name, Survivors[i]->age ); }
304
+
305
+ ```

1

別のを追記

2021/11/19 09:49

投稿

fana
fana

スコア11996

test CHANGED
@@ -117,3 +117,127 @@
117
117
  }
118
118
 
119
119
  ```
120
+
121
+
122
+
123
+ ---
124
+
125
+
126
+
127
+ [追記]
128
+
129
+ あるいは,こんなのでも良いかもしれない.
130
+
131
+
132
+
133
+ * 各々が,自身よりも若い者のいずれか1人を指し示す(対象がいない場合は何もしない)
134
+
135
+ * 最も指し示された人は退場する(全員の指し示された数が0回だろうが,とにかく誰かを退場させる)
136
+
137
+
138
+
139
+ というのを,最後の1人になるまで繰り返す.
140
+
141
+
142
+
143
+ ```C
144
+
145
+ int main(void)
146
+
147
+ {
148
+
149
+ //※入力部は省略
150
+
151
+ const Students data[10] = {
152
+
153
+ {"A",5}, {"B",38}, {"C",8}, {"D",6}, {"E",1},
154
+
155
+ {"F",16}, {"G",4}, {"H",7}, {"I",0}, {"J",3}
156
+
157
+ };
158
+
159
+
160
+
161
+ //初期状態:最初は10人全員
162
+
163
+ int nSurvivors = 10;
164
+
165
+ const Students *Survivors[10] = { 0 };
166
+
167
+ for( int i=0; i<10; ++i ){ Survivors[i] = data+i; }
168
+
169
+
170
+
171
+ //残り1人になるまで追放審議会を繰り返す.
172
+
173
+ while( nSurvivors > 1 )
174
+
175
+ {
176
+
177
+ //各々が追放したい1人に投票する(ただし,自身より若い奴にしか投票しない)
178
+
179
+ int VotingSpace[10] = { 0 };
180
+
181
+ for( int i=0; i<nSurvivors; ++i )
182
+
183
+ {
184
+
185
+ //てきとーに自分りも若い奴を1人見つけて,そいつに投票する
186
+
187
+ for( int j=0; j<nSurvivors; ++j )
188
+
189
+ {
190
+
191
+ if( Survivors[i]->age > Survivors[j]->age )
192
+
193
+ {
194
+
195
+ VotingSpace[j]++;
196
+
197
+ break;
198
+
199
+ }
200
+
201
+ }
202
+
203
+ }
204
+
205
+ //最も票が多かった人は追放です
206
+
207
+ int iMaxVote = 0;
208
+
209
+ int MaxVote = VotingSpace[0];
210
+
211
+ for( int i=1; i<nSurvivors; ++i )
212
+
213
+ {
214
+
215
+ if( MaxVote < VotingSpace[i] )
216
+
217
+ {
218
+
219
+ iMaxVote = i;
220
+
221
+ MaxVote = VotingSpace[i];
222
+
223
+ }
224
+
225
+ }
226
+
227
+ Survivors[ iMaxVote ] = Survivors[ nSurvivors-1 ];
228
+
229
+ --nSurvivors;
230
+
231
+ }
232
+
233
+
234
+
235
+ //結果表示
236
+
237
+ printf( "%s : %d\n", Survivors[0]->name, Survivors[0]->age );
238
+
239
+ return 0;
240
+
241
+ }
242
+
243
+ ```