競プロ精進ログ

【競プロ精進ログ】【2021/03/22】ABC088: C ARC115: B

競技プログラミングのための精進履歴をブログ形式で残していきます。

目標は AtCoder 水色!
今のレートは茶色です。

本日の精進ツリーは以下のとおり。

精進ツリー

  1. ABC088: C - Takahashi's Information
  2. ARC115: B - Plus Matrix
  3. まとめ

ABC088: C - Takahashi's Information

ABC088 より、ABC088: C - Takahashi's Informationを解きました。
難易度は茶色。

提出コードはこちら。

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define SIZE_OF_ARRAY(array) (sizeof(array) / sizeof(array[0]))
using namespace std;

#define MAX 100010
#define NIL -1

using lint = long long int;
using P = pair<lint, lint>;

/*************************************************************************************
NOTE: 

・a1が定まれば、そのほかの値もすべて定まる
・a1の取りうる範囲で全探索
*************************************************************************************/

bool check(vector<vector<lint>> G, vector<lint> A, vector<lint> B)
{
    rep(i, 3)
    {
        rep(j, 3)
        {
            if (G[i][j] != (A[i] + B[j]))
            {
                return false;
            }
        }
    }
    return true;
}

int main()
{
    lint N = 3;
    lint c;
    vector<vector<lint>> G(N);

    rep(i, N)
    {
        rep(j, N)
        {
            cin >> c;
            G[i].push_back(c);
        }
    }
    
    vector<lint> A(3, 0);
    vector<lint> B(3, 0);
    for (lint i = -200; i <= 200; i++)
    {
        A[0] = i;
        B[0] = G[0][0] - A[0];
        B[1] = G[0][1] - A[0];
        B[2] = G[0][2] - A[0];
        A[1] = G[1][0] - B[0];
        A[2] = G[2][0] - B[0];
        if (check(G, A, B))
        {
            cout << "Yes" << endl;
            return 0;
        }
    }

    cout << "No" << endl;
    return 0;
}

ARC115: B - Plus Matrix

ARC115 より、ARC115: B - Plus Matrixを解きました。
難易度は茶色。

提出コードはこちら。

N = int(input())
C = []
A = [0] * N
B = [0] * N

def check(C, A, B):
    for i, c in enumerate(C):
        for j, n in enumerate(c):
            if n != A[i] + B[j]:
                return False
            
            if A[i] < 0 or B[j] < 0:
                return False
    return True

for i in range(N):
    c = list(map(int,input().split()))
    C.append(c)

m = pow(10, 9) + 1
for i in range(N):
    m = min(m, C[i][0])

for i in range(N):
    A[i] = C[i][0] - m

for j in range(N):
    B[j] = C[0][j] - A[0]

if check(C, A, B):
    print("Yes")
    for a in A:
        print(a, end=" ")
    print("")

    for b in B:
        print(b, end=" ")
    print("")
    exit()
    
print("No")

まとめ

しばらく思うようにパフォーマンス出せていなかったのですが、ARCの緑パフォで少しモチベーションを取り戻せました。
引き続き精進!

COMMENT

メールアドレスが公開されることはありません。