質問編集履歴

1

質問内容が途中までの内容でアップロードされていたため、更新しました

2021/10/30 05:37

投稿

taka10taka12
taka10taka12

スコア7

test CHANGED
File without changes
test CHANGED
@@ -34,48 +34,182 @@
34
34
 
35
35
  A1,1 A1,2 ・・・ A1,W
36
36
 
37
- A2,1 A2,2 ・・・ A2,
37
+ A2,1 A2,2 ・・・ A2,W
38
+
39
+
40
+
41
+ AH,1 AH,2 ・・・ AH,W
38
42
 
39
43
  ```
40
44
 
41
45
 
42
46
 
43
-
47
+ **出力**
48
+
44
-
49
+ ```出力
50
+
45
- ### 発生している問題エラーメッセージ
51
+ B1,1 B1,2 ・・ B1,W
52
+
46
-
53
+ B2,1 B2,2 ・・・ B2,W
54
+
47
-
55
+
56
+
57
+ BH,1 BH,2 ・・・ BH,W
48
58
 
49
59
  ```
50
60
 
61
+
62
+
51
- エラーメッセージ
63
+ ### 自分の回答
64
+
65
+ マス(i,j)ごとにi行の合計とj列の合計を計算すると、計算量はo(HW(H+W))となる。
66
+
67
+ これでは計算量がo(10^9)となり、計算量が膨大となるため、以下の方法で回答を作成した。
68
+
69
+ ①前処理として、先にi行の合計及びj列の合計を求め、結果をメモする
70
+
71
+ ②マス(i,j)の出力として(i行の合計値)+(j列の合計値)-(マス(i,j)の値)を計算
72
+
73
+ 以上の処理を行うことで、計算量としてはo(HW)に抑えられる。
74
+
75
+ 以上の考えのもと、以下のコードを作成した。
76
+
77
+ ```C#
78
+
79
+ using System;
80
+
81
+ using System.Collections.Generic;
82
+
83
+ using System.Linq;
84
+
85
+
86
+
87
+ namespace AtCoder
88
+
89
+ {
90
+
91
+ class Problem
92
+
93
+ {
94
+
95
+ static void Main()
96
+
97
+ {
98
+
99
+ // Step1 入力を受け取る
100
+
101
+ // 整数H,Wを受け取る
102
+
103
+ var input = Console.ReadLine().Split(" ").Select(int.Parse).ToArray();
104
+
105
+ var H = input[0];
106
+
107
+ var W = input[1];
108
+
109
+
110
+
111
+ // H行W列の配列を受け取る
112
+
113
+ int[,] nums = new int[H,W];
114
+
115
+ for(int i = 0; i < H; i++)
116
+
117
+ {
118
+
119
+ var gyou = Console.ReadLine().Split().Select(int.Parse).ToArray();
120
+
121
+ for (int j = 0; j < W; j++)
122
+
123
+ {
124
+
125
+ nums[i,j] = gyou[j];
126
+
127
+ }
128
+
129
+ }
130
+
131
+
132
+
133
+ // (前処理)1行ごと1列ごとに合計を求め、メモする
134
+
135
+ // 横方向の合計の計算メモを作成
136
+
137
+ int[] sumArrayH = new int[H];
138
+
139
+ // 縦方向の合計の計算メモを作成
140
+
141
+ int[] sumArrayW = new int[W];
142
+
143
+
144
+
145
+ // 縦方向と横方向の計算結果をメモに入力する
146
+
147
+ for (int i = 0; i < H; i++)
148
+
149
+ {
150
+
151
+ for (int j = 0; j < W; j++)
152
+
153
+ {
154
+
155
+ sumArrayH[i] += nums[i,j];
156
+
157
+ sumArrayW[j] += nums[i,j];
158
+
159
+ }
160
+
161
+ }
162
+
163
+
164
+
165
+ // Step3 マス(i,j)の計算を行い、結果を出力する
166
+
167
+ for (int i = 0; i < H; i++)
168
+
169
+ {
170
+
171
+ var sum = 0;
172
+
173
+ for (int j = 0; j < W; j++)
174
+
175
+ {
176
+
177
+ sum = sumArrayH[i] + sumArrayW[j] - nums[i,j];
178
+
179
+ Console.Write("{0} ", sum);
180
+
181
+ }
182
+
183
+ Console.WriteLine("");
184
+
185
+ }
186
+
187
+ }
188
+
189
+ }
190
+
191
+ }
52
192
 
53
193
  ```
54
194
 
55
195
 
56
196
 
57
- ### 該当のソースコード
58
-
59
-
60
-
61
- ```ここに言語名を入力
62
-
63
- ソースコード
64
-
65
- ```
66
-
67
-
68
-
69
- ### 試したこと
197
+ ### 提出結果
70
-
71
-
72
-
198
+
199
+
200
+
73
- ここに問題に対して試したことを記載してください。
201
+ AC 14
74
-
75
-
76
-
202
+
77
- ### 補足情報FW/ツールのバージョンなど
203
+ TLE 2 hand04.txt、random07.txt
204
+
205
+
206
+
207
+
208
+
78
-
209
+ ### 分からない点
210
+
211
+
212
+
79
-
213
+ 公式の回答も前処理を使っており、TLEとなる原因がわかりません。
80
-
214
+
81
- ここにより詳細な情報を記載しい。
215
+ 教えいたけると幸です