AtCoder 로그: 0077 - ABC 088 C
9391 단어 C++AtCoderAtCoder에 등록하면 다음에 할 일
문제
문제문
$3\times 3$ 의 그리드가 있습니다. {i, j} $가 쓰여졌습니다. a_i + b_j $가 작성된 것 같습니다.
Takahashi의 정보가 올바른지 확인하십시오.
제약
· $c_{i,j}~(1\le i\le 3, 1\le j\le 3)$ 는 $0$ 이상 $100$ 이하의 정수
수록된 문제 세트
AtCoder에 등록하면 다음 작업 ( 제08문제제 )
답변
답변 1 (AC)
할 수 있는 일이 많고, 반대로 무엇을 하면 좋을지 알기 어려운 문제입니다. 이 문제의 포인트는 변수 $a_1,a_2,a_3,b_1,b_2,b_3$ 의 값을 구할 수 없다는 것입니다. 6개의 변수의 합 $a_i+b_j$ 는 9 종류이므로, 개개의 변수의 값이 요구될 것 같습니다만, 이하의 고찰에 의해 무리인 것을 알 수 있습니다: 3개의 변수 $a_1, a_2,a_3$ 의 값은 무관하므로, 1열째에 줄지어 있는 3종류의 변수의 합 $a_1+b_1$, $a_2+b_1$, $a_3+b_1$ 의 값도 무관하다. 또한, 3개의 변수 $b_1, b_2, b_3$ 의 값은 무관하므로, 1행째에 줄지어 있는 3 종류의 변수의 합 $a_1+b_1$, $a_1+b_2$, $a_1+b_3$ 의 값 역시 무관하다. 따라서 5 종류의 변수의 합 $a_1+b_1$, $a_2+b_1$, $a_3+b_1$, $a_1+b_2$, $a_1+b_3$ 의 값은 무관하다. 반대로, 다른 네 가지 변수의 합 $a_2+b_2$, $a_3+b_2$, $a_2+b_3,a_3+b_3$ 는 다른 변수의 합과 관계가 있습니다. 의 합으로부터 계산할 수 있다. 예를 들어 $a_2+b_2=(a_1+b_2)+(a_2+b_1)-(a_1+b_1)$ 로 변형할 수 있으므로 변수의 합 $a_2+b_2$ 는 3 종류의 변수의 합 $a_1+b_2$, $a_2+b_1$, $a_1+b_1$ 에서 계산할 수 있습니다.
코드를 작성할 때는, 1행째와 1열째의 5종류의 값이 올바르다고 가정해, 나머지의 4종류의 값이 철저히 되어 있는지를 확인하면 좋을 것입니다. 예를 들어 열별로 보면 각 열의 첫 번째 행과 두 번째 행의 차이는 항상 $S = a_2-a_1 $이고 두 번째 행과 세 번째 행의 차이는 항상 $ T = a_3-a_2 $입니다. 해야합니다. 따라서 특정 변수 값 $c_{i,j}$에 대해 첫 번째 열에서 $S,T$를 구하고 두 번째 열과 세 번째 열의 차이가 $S,T$인지 여부 체크하면 좋을 것입니다. 코드는 다음과 같습니다.
abc088c-1.cpp#include <bits/stdc++.h>
using namespace std;
int main() {
vector<vector<int>> c(3, vector<int>(3));
for ( int i=0; i<3; i++ ) {
for ( int j=0; j<3; j++ ) {
cin >> c.at(i).at(j);
}
}
int s = c.at(1).at(0)-c.at(0).at(0);
int t = c.at(2).at(0)-c.at(1).at(0);
string answer = "Yes";
if ( c.at(1).at(1)-c.at(0).at(1)!=s ) {
answer = "No";
} else if ( c.at(2).at(1)-c.at(1).at(1)!=t ) {
answer = "No";
} else if ( c.at(1).at(2)-c.at(0).at(2)!=s ) {
answer = "No";
} else if ( c.at(2).at(2)-c.at(1).at(2)!=t ) {
answer = "No";
}
cout << answer << endl;
}
조사한 것
AtCoder 해설 → 사용자 설명
$a_1,a_2,a_3$ 를 루프로 변경해, 관계식으로부터 $b_1,b_2,b_3$ 를 구해, 나머지 관계식의 철쭉이 있는지를 체크하는 해법입니다.
AtCoder 해설 → 콘테스트 전체 해설
$a_1=0$ 로 두는 것으로 다른 변수의 값을 확정시켜, 나머지 관계식의 철쭉이 있는지를 체크하는 해법입니다.
링크
전후 기사
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<vector<int>> c(3, vector<int>(3));
for ( int i=0; i<3; i++ ) {
for ( int j=0; j<3; j++ ) {
cin >> c.at(i).at(j);
}
}
int s = c.at(1).at(0)-c.at(0).at(0);
int t = c.at(2).at(0)-c.at(1).at(0);
string answer = "Yes";
if ( c.at(1).at(1)-c.at(0).at(1)!=s ) {
answer = "No";
} else if ( c.at(2).at(1)-c.at(1).at(1)!=t ) {
answer = "No";
} else if ( c.at(1).at(2)-c.at(0).at(2)!=s ) {
answer = "No";
} else if ( c.at(2).at(2)-c.at(1).at(2)!=t ) {
answer = "No";
}
cout << answer << endl;
}
AtCoder 해설 → 사용자 설명
$a_1,a_2,a_3$ 를 루프로 변경해, 관계식으로부터 $b_1,b_2,b_3$ 를 구해, 나머지 관계식의 철쭉이 있는지를 체크하는 해법입니다.
AtCoder 해설 → 콘테스트 전체 해설
$a_1=0$ 로 두는 것으로 다른 변수의 값을 확정시켜, 나머지 관계식의 철쭉이 있는지를 체크하는 해법입니다.
링크
전후 기사
Reference
이 문제에 관하여(AtCoder 로그: 0077 - ABC 088 C), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RoadLynton/items/2e7f3cddfc34d92dae8e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)