質問編集履歴

2

表示がバグってたので修正

2018/09/15 07:13

投稿

fly3555
fly3555

スコア13

test CHANGED
File without changes
test CHANGED
@@ -152,13 +152,173 @@
152
152
 
153
153
  }
154
154
 
155
+ }
156
+
157
+
158
+
159
+ cout << ans << endl;
160
+
161
+ }
162
+
163
+
164
+
155
- }```ここに言語を入力
165
+ int main() {
156
-
166
+
157
- コード
167
+ solve();
168
+
169
+ return 0;
170
+
171
+ }
158
172
 
159
173
  ```
160
174
 
175
+
176
+
177
+ ### 補足情報
178
+
179
+
180
+
181
+ C++ (GCC 5.4.1) で提出しました。
182
+
183
+
184
+
185
+ ### 修正したソースコード
186
+
187
+ 2018/09/15作成。
188
+
189
+
190
+
191
+ ```C++
192
+
193
+ #include <iostream>
194
+
195
+ #include <algorithm>
196
+
197
+ #include <cassert>
198
+
199
+
200
+
201
+ using namespace std;
202
+
203
+
204
+
205
+ #define MAXN 2000
206
+
207
+ #define INF 1000000000 //修正
208
+
209
+
210
+
211
+ int N, K;
212
+
213
+ int a[MAXN + 1];
214
+
215
+ int dp[MAXN + 1][MAXN + 1];
216
+
217
+
218
+
219
+ void solve() {
220
+
221
+ int ans;
222
+
223
+ cin >> N >> K;
224
+
225
+ for (int i = 1; i <= N; ++i) {
226
+
227
+ cin >> a[i];
228
+
229
+ }
230
+
231
+
232
+
233
+ int sumA = 0;
234
+
235
+ for (int i = 1; i <= N; ++i) {
236
+
237
+ sumA += a[i];
238
+
239
+ }
240
+
241
+ if (sumA <= K) {
242
+
243
+ ans = 1;
244
+
245
+ }
246
+
247
+ else {
248
+
249
+ /*dp[tmpN][tmpW]は、tmpN日ゲームをして機嫌のいい日がtmpW日となる最小の勝ち数の合計*/
250
+
251
+ /*tmpN>=tmpWの場合だけ考える*/
252
+
253
+ /*tmpW=0のとき、dp[tmpN][0]=0*/
254
+
255
+ /*tmpN=tmpW>0のとき、tmpN=1以外は不可能
256
+
257
+ ↑間違い a[1]=1のときはtmpN=1以外は不可能だが、a[1]>1のときは可能なケースがある*/
258
+
259
+ //dp[1][1] = 1;
260
+
261
+ //for (int i = 2; i <= N; ++i) {
262
+
263
+ // dp[i][i] = INF;
264
+
265
+ //}
266
+
267
+ /*tmpN>=tmpW>0のとき*/
268
+
269
+ dp[1][1] = 1;
270
+
271
+ int A_previous_tmpN = a[1]; //前日までの勝ち数の合計
272
+
273
+ for (int tmpN = 2; tmpN <= N; ++tmpN) {
274
+
275
+ dp[tmpN - 1][tmpN] = INF;
276
+
277
+ for (int tmpW = 1; tmpW <= tmpN; ++tmpW) {
278
+
279
+ const int k_tmpN = (a[1] == 1 && tmpW == tmpN) ? INF : (long long int) dp[tmpN - 1][tmpW - 1]
280
+
281
+ * a[tmpN] / A_previous_tmpN + 1;
282
+
283
+ //tmpN日に機嫌がよくなるために必要な勝ち数
284
+
285
+ assert(k_tmpN > 0);
286
+
287
+ dp[tmpN][tmpW] = min(dp[tmpN - 1][tmpW],
288
+
289
+ dp[tmpN - 1][tmpW - 1] + k_tmpN);
290
+
291
+ }
292
+
293
+ A_previous_tmpN += a[tmpN];
294
+
295
+ }
296
+
297
+ for (int tmpN = 0; tmpN <= N; ++tmpN) {
298
+
299
+ for (int tmpW = 0; tmpW <= N; ++tmpW) {
300
+
301
+ assert(dp[tmpN][tmpW] >= 0);
302
+
303
+ }
304
+
305
+ }
306
+
307
+ for (int tmpW = N; tmpW >= 0; --tmpW) {
308
+
309
+ if (dp[N][tmpW] <= K) {
310
+
311
+ ans = tmpW;
312
+
313
+ break;
314
+
315
+ }
316
+
317
+ }
318
+
319
+ }
320
+
161
- cout << ans << endl;
321
+ cout << ans << endl;
162
322
 
163
323
  }
164
324
 
@@ -166,172 +326,10 @@
166
326
 
167
327
  int main() {
168
328
 
169
- solve();
329
+ solve();
170
-
330
+
171
- return 0;
331
+ return 0;
172
332
 
173
333
  }
174
334
 
175
335
  ```
176
-
177
-
178
-
179
- ### 補足情報
180
-
181
-
182
-
183
- C++ (GCC 5.4.1) で提出しました。
184
-
185
-
186
-
187
- ### 修正したソースコード
188
-
189
- 2018/09/15作成。
190
-
191
-
192
-
193
- ```C++
194
-
195
- #include <iostream>
196
-
197
- #include <algorithm>
198
-
199
- #include <cassert>
200
-
201
-
202
-
203
- using namespace std;
204
-
205
-
206
-
207
- #define MAXN 2000
208
-
209
- #define INF 1000000000 //修正
210
-
211
-
212
-
213
- int N, K;
214
-
215
- int a[MAXN + 1];
216
-
217
- int dp[MAXN + 1][MAXN + 1];
218
-
219
-
220
-
221
- void solve() {
222
-
223
- int ans;
224
-
225
- cin >> N >> K;
226
-
227
- for (int i = 1; i <= N; ++i) {
228
-
229
- cin >> a[i];
230
-
231
- }
232
-
233
-
234
-
235
- int sumA = 0;
236
-
237
- for (int i = 1; i <= N; ++i) {
238
-
239
- sumA += a[i];
240
-
241
- }
242
-
243
- if (sumA <= K) {
244
-
245
- ans = 1;
246
-
247
- }
248
-
249
- else {
250
-
251
- /*dp[tmpN][tmpW]は、tmpN日ゲームをして機嫌のいい日がtmpW日となる最小の勝ち数の合計*/
252
-
253
- /*tmpN>=tmpWの場合だけ考える*/
254
-
255
- /*tmpW=0のとき、dp[tmpN][0]=0*/
256
-
257
- /*tmpN=tmpW>0のとき、tmpN=1以外は不可能
258
-
259
- ↑間違い a[1]=1のときはtmpN=1以外は不可能だが、a[1]>1のときは可能なケースがある*/
260
-
261
- //dp[1][1] = 1;
262
-
263
- //for (int i = 2; i <= N; ++i) {
264
-
265
- // dp[i][i] = INF;
266
-
267
- //}
268
-
269
- /*tmpN>=tmpW>0のとき*/
270
-
271
- dp[1][1] = 1;
272
-
273
- int A_previous_tmpN = a[1]; //前日までの勝ち数の合計
274
-
275
- for (int tmpN = 2; tmpN <= N; ++tmpN) {
276
-
277
- dp[tmpN - 1][tmpN] = INF;
278
-
279
- for (int tmpW = 1; tmpW <= tmpN; ++tmpW) {
280
-
281
- const int k_tmpN = (a[1] == 1 && tmpW == tmpN) ? INF : (long long int) dp[tmpN - 1][tmpW - 1]
282
-
283
- * a[tmpN] / A_previous_tmpN + 1;
284
-
285
- //tmpN日に機嫌がよくなるために必要な勝ち数
286
-
287
- assert(k_tmpN > 0);
288
-
289
- dp[tmpN][tmpW] = min(dp[tmpN - 1][tmpW],
290
-
291
- dp[tmpN - 1][tmpW - 1] + k_tmpN);
292
-
293
- }
294
-
295
- A_previous_tmpN += a[tmpN];
296
-
297
- }
298
-
299
- for (int tmpN = 0; tmpN <= N; ++tmpN) {
300
-
301
- for (int tmpW = 0; tmpW <= N; ++tmpW) {
302
-
303
- assert(dp[tmpN][tmpW] >= 0);
304
-
305
- }
306
-
307
- }
308
-
309
- for (int tmpW = N; tmpW >= 0; --tmpW) {
310
-
311
- if (dp[N][tmpW] <= K) {
312
-
313
- ans = tmpW;
314
-
315
- break;
316
-
317
- }
318
-
319
- }
320
-
321
- }
322
-
323
- cout << ans << endl;
324
-
325
- }
326
-
327
-
328
-
329
- int main() {
330
-
331
- solve();
332
-
333
- return 0;
334
-
335
- }
336
-
337
- ```

1

修正したコードを追加

2018/09/15 07:12

投稿

fly3555
fly3555

スコア13

test CHANGED
File without changes
test CHANGED
@@ -152,7 +152,11 @@
152
152
 
153
153
  }
154
154
 
155
+ }```ここに言語を入力
156
+
155
- }
157
+ コード
158
+
159
+ ```
156
160
 
157
161
  cout << ans << endl;
158
162
 
@@ -177,3 +181,157 @@
177
181
 
178
182
 
179
183
  C++ (GCC 5.4.1) で提出しました。
184
+
185
+
186
+
187
+ ### 修正したソースコード
188
+
189
+ 2018/09/15作成。
190
+
191
+
192
+
193
+ ```C++
194
+
195
+ #include <iostream>
196
+
197
+ #include <algorithm>
198
+
199
+ #include <cassert>
200
+
201
+
202
+
203
+ using namespace std;
204
+
205
+
206
+
207
+ #define MAXN 2000
208
+
209
+ #define INF 1000000000 //修正
210
+
211
+
212
+
213
+ int N, K;
214
+
215
+ int a[MAXN + 1];
216
+
217
+ int dp[MAXN + 1][MAXN + 1];
218
+
219
+
220
+
221
+ void solve() {
222
+
223
+ int ans;
224
+
225
+ cin >> N >> K;
226
+
227
+ for (int i = 1; i <= N; ++i) {
228
+
229
+ cin >> a[i];
230
+
231
+ }
232
+
233
+
234
+
235
+ int sumA = 0;
236
+
237
+ for (int i = 1; i <= N; ++i) {
238
+
239
+ sumA += a[i];
240
+
241
+ }
242
+
243
+ if (sumA <= K) {
244
+
245
+ ans = 1;
246
+
247
+ }
248
+
249
+ else {
250
+
251
+ /*dp[tmpN][tmpW]は、tmpN日ゲームをして機嫌のいい日がtmpW日となる最小の勝ち数の合計*/
252
+
253
+ /*tmpN>=tmpWの場合だけ考える*/
254
+
255
+ /*tmpW=0のとき、dp[tmpN][0]=0*/
256
+
257
+ /*tmpN=tmpW>0のとき、tmpN=1以外は不可能
258
+
259
+ ↑間違い a[1]=1のときはtmpN=1以外は不可能だが、a[1]>1のときは可能なケースがある*/
260
+
261
+ //dp[1][1] = 1;
262
+
263
+ //for (int i = 2; i <= N; ++i) {
264
+
265
+ // dp[i][i] = INF;
266
+
267
+ //}
268
+
269
+ /*tmpN>=tmpW>0のとき*/
270
+
271
+ dp[1][1] = 1;
272
+
273
+ int A_previous_tmpN = a[1]; //前日までの勝ち数の合計
274
+
275
+ for (int tmpN = 2; tmpN <= N; ++tmpN) {
276
+
277
+ dp[tmpN - 1][tmpN] = INF;
278
+
279
+ for (int tmpW = 1; tmpW <= tmpN; ++tmpW) {
280
+
281
+ const int k_tmpN = (a[1] == 1 && tmpW == tmpN) ? INF : (long long int) dp[tmpN - 1][tmpW - 1]
282
+
283
+ * a[tmpN] / A_previous_tmpN + 1;
284
+
285
+ //tmpN日に機嫌がよくなるために必要な勝ち数
286
+
287
+ assert(k_tmpN > 0);
288
+
289
+ dp[tmpN][tmpW] = min(dp[tmpN - 1][tmpW],
290
+
291
+ dp[tmpN - 1][tmpW - 1] + k_tmpN);
292
+
293
+ }
294
+
295
+ A_previous_tmpN += a[tmpN];
296
+
297
+ }
298
+
299
+ for (int tmpN = 0; tmpN <= N; ++tmpN) {
300
+
301
+ for (int tmpW = 0; tmpW <= N; ++tmpW) {
302
+
303
+ assert(dp[tmpN][tmpW] >= 0);
304
+
305
+ }
306
+
307
+ }
308
+
309
+ for (int tmpW = N; tmpW >= 0; --tmpW) {
310
+
311
+ if (dp[N][tmpW] <= K) {
312
+
313
+ ans = tmpW;
314
+
315
+ break;
316
+
317
+ }
318
+
319
+ }
320
+
321
+ }
322
+
323
+ cout << ans << endl;
324
+
325
+ }
326
+
327
+
328
+
329
+ int main() {
330
+
331
+ solve();
332
+
333
+ return 0;
334
+
335
+ }
336
+
337
+ ```