問題
問題文
$N$ 個のソースコードがあり、$i$ 個目のソースコードの特徴は $A_{i1},A_{i2},\ldots,A_{iM}$ の $M$ 個の整数で表されます。
また、整数 $B_1,B_2,\ldots,B_M$ と 整数 $C$ が与えられます。
$A_{i1}B_1+A_{i2}B_2+\ldots+A_{iM}B_M+C>0$ のときに限り、$i$ 個目のソースコードはこの問題に正答するソースコードです。
$N$ 個のソースコードのうち、この問題に正答するソースコードの個数を求めてください。
制約
・入力は全て整数である。
・$1 \le N,M \le 20$
・$−100 \le A_{ij} \le 100$
・$−100 \le B_i \le 100$
・$−100 \le C \le 100$
収録されている問題セット
回答
回答1 (AC)
$i$ 個目のソースコードが正答しているかどうかは、その特徴 $A_{i1},A_{i2},\ldots,A_{iM}$ に対して$A_{i1}B_1+A_{i2}B_2+\ldots+A_{iM}B_M+C$ を計算し、これが正ならば正答となります。この作業を繰り返して、正答の個数を求めれば良いでしょう。ソーソコードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, c;
cin >> n >> m >> c;
vector<int> b(m);
for ( int j=0; j<m; j++ ) {
cin >> b.at(j);
}
vector<vector<int>> a(n,vector<int>(m));
for ( int i=0; i<n; i++ ) {
for ( int j=0; j<m; j++ ) {
cin >> a.at(i).at(j);
}
}
int sum, answer = 0;
for ( int i=0; i<n; i++ ) {
sum = c;
for ( int j=0; j<m; j++ ) {
sum += a.at(i).at(j)*b.at(j);
}
if ( sum>0 ) {
answer += 1;
}
}
cout << answer << endl;
}
回答2 (AC)
回答1を少しだけ改良します。ソースコードの特徴 $a_{ij}$ は1回しか使わないので、わざわざ配列の保持するに必要がありません。cin で読み込んだらすぐに計算することで、全体の処理をスリムにすることが出来ます。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, c;
cin >> n >> m >> c;
vector<int> b(m);
for ( int j=0; j<m; j++ ) {
cin >> b.at(j);
}
int a, answer = 0;
for ( int i=0; i<n; i++ ) {
int sum = c;
for ( int j=0; j<m; j++ ) {
cin >> a;
sum += a*b.at(j);
}
if ( sum>0 ) {
answer += 1;
}
}
cout << answer << endl;
}
調べたこと
AtCoder の解説 → コンテスト全体の解説
回答1と同じ方針でした。
リンク
前後の記事
- 前の記事 → AtCoderログ:0083 - ABC 112 C
- 次の記事 → AtCoderログ:0085 - ABC 049 C