回答編集履歴

2

追記

2019/02/22 15:58

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -193,3 +193,67 @@
193
193
 
194
194
 
195
195
  競プロには不慣れなので、無駄な処理をいっぱい書いていると思いますが。
196
+
197
+
198
+
199
+ ---
200
+
201
+ 自由に解いて良いなら、こう。
202
+
203
+ ```C++
204
+
205
+ #include <cstdio>
206
+
207
+
208
+
209
+ int main(void) {
210
+
211
+ int N, Y;
212
+
213
+ if(std::scanf("%d %d", &N, &Y) != 2) return 1;
214
+
215
+
216
+
217
+ int D = Y / 1000 - N;
218
+
219
+ for(int a = 0; a <= N; ++a) {
220
+
221
+ if(10000 * a > Y) break;
222
+
223
+
224
+
225
+ int tmp = D - 9*a;
226
+
227
+ if(tmp % 4 == 0) {
228
+
229
+ int b = tmp / 4;
230
+
231
+ int c = N - a - b;
232
+
233
+
234
+
235
+ if(b < 0) continue;
236
+
237
+ if(c < 0) continue;
238
+
239
+
240
+
241
+ std::printf("%d %d %d\n", a, b, c);
242
+
243
+ return 0;
244
+
245
+ }
246
+
247
+ }
248
+
249
+
250
+
251
+ std::printf("-1 -1 -1\n");
252
+
253
+ }
254
+
255
+ ```
256
+
257
+
258
+
259
+ [提出結果](https://atcoder.jp/contests/abc085/submissions/4349980)

1

追記

2019/02/22 15:58

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -23,3 +23,173 @@
23
23
  また、ここのans_xyzとmain関数のans_xyzは**全くの別物**です。
24
24
 
25
25
  変数の使い方及びポインタの使い方を再確認しましょう。
26
+
27
+
28
+
29
+ 書いてみた
30
+
31
+ ---
32
+
33
+ TLEを回避するのにそれなりに苦労しましたが、再帰でAC取りました。
34
+
35
+ ```C++
36
+
37
+ #include <iostream>
38
+
39
+
40
+
41
+
42
+
43
+ struct Answer {
44
+
45
+ int yen_10000;
46
+
47
+ int yen_5000;
48
+
49
+ int yen_1000;
50
+
51
+
52
+
53
+ bool is_valid() {
54
+
55
+ return yen_10000 != -1;
56
+
57
+ }
58
+
59
+
60
+
61
+ void print() {
62
+
63
+ std::printf(
64
+
65
+ "%d %d %d\n",
66
+
67
+ yen_10000, yen_5000, yen_1000
68
+
69
+ );
70
+
71
+ }
72
+
73
+ };
74
+
75
+
76
+
77
+ struct Cond {
78
+
79
+ bool use_10000 = true;
80
+
81
+ bool use_5000 = true;
82
+
83
+ bool use_1000 = true;
84
+
85
+ };
86
+
87
+
88
+
89
+
90
+
91
+ // n枚で1000*y円作る組み合わせを返す
92
+
93
+ Answer solve(const int n, const int ky, Cond cond) {
94
+
95
+ //
96
+
97
+ if(n == 0 && ky == 0) {
98
+
99
+ return {0, 0, 0};
100
+
101
+ }
102
+
103
+ if(ky == 0) {
104
+
105
+ return {-1, -1, -1};
106
+
107
+ }
108
+
109
+ if(ky == n) {
110
+
111
+ return {0, 0, n};
112
+
113
+ }
114
+
115
+
116
+
117
+ //
118
+
119
+ if(cond.use_10000) {
120
+
121
+ for(int num = ky / 10; num >= 0; --num) {
122
+
123
+ auto ans = solve(
124
+
125
+ n - num, ky - num*10,
126
+
127
+ {false, true, true}
128
+
129
+ );
130
+
131
+ if(ans.is_valid()) {
132
+
133
+ ans.yen_10000 += num;
134
+
135
+ return ans;
136
+
137
+ }
138
+
139
+ }
140
+
141
+ }
142
+
143
+ if(cond.use_5000) {
144
+
145
+ for(int num = ky / 5; num >= 0; --num) {
146
+
147
+ auto ans = solve(
148
+
149
+ n - num, ky - num*5,
150
+
151
+ {false, false, true}
152
+
153
+ );
154
+
155
+ if(ans.is_valid()) {
156
+
157
+ ans.yen_5000 += num;
158
+
159
+ return ans;
160
+
161
+ }
162
+
163
+ }
164
+
165
+ }
166
+
167
+
168
+
169
+ return {-1, -1, -1};
170
+
171
+ }
172
+
173
+
174
+
175
+ int main(void) {
176
+
177
+ int N, Y;
178
+
179
+ std::cin >> N >> Y;
180
+
181
+
182
+
183
+ solve(N, Y/1000, {}).print();
184
+
185
+ }
186
+
187
+ ```
188
+
189
+
190
+
191
+ [提出結果](https://atcoder.jp/contests/abc085/submissions/4349569)
192
+
193
+
194
+
195
+ 競プロには不慣れなので、無駄な処理をいっぱい書いていると思いますが。