DynamicCube.exe

12 object(s)
 

Codeforces Round #627(Div.3) 연습

코드포스 레드를 달성하기 위해 이번 달 민트 이상을 달성하는 것을 목표로 세우고 연습하였다.

총 6문제였고, 그 중 A,B,C,D번을 풀었다. 신기록이라 많이 기뻤다.

A번

대충 2*1 블록을 넣어서 직사각형 형태로 만들수 있는지의 여부를 묻는 문제이다.

그냥 쉽게 생각하면 블록 수가 모두 짝수이거나 홀수이면 직사각형이 될수 있음을 알 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
#define MEM 50
#define sanic ios_base::sync_with_stdio(0);
using namespace std;
int t,n;
int main()
{
    sanic;
    cin >> t;
    while(t--){
        int c=0;
        cin >> n;
        for(int i=0; i<n; i++){
            int q1;
            cin >> q1;
            c += q1%2;
        }
        if(!|| c==n) cout << "YES\n";
        else cout << "NO\n";
    }
}
cs

B번

부분 팰린드롬이 존재하냐를 묻는 문제인데, 아무 인덱스나 골라서 적어도 3자리 이상 팰린드롬을 만드는 것이다.

그냥 2칸 이상 떨어진 것 중에서 같은 숫자 쌍이 존재한다면 “YES”를 출력하면 된다.

왜냐하면 3자리 팰린드롬은 중간과 상관없이 양 끝만 같기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
#define MEM 5005
#define sanic ios_base::sync_with_stdio(0);
using namespace std;
int t,n;
int a[MEM];
int main()
{
    sanic;
    cin >> t;
    while(t--){
        int c=0;
        cin >> n;
        for(int i=0; i<n; i++)
            cin >> a[i];
        for(int i=0; i<n; i++)
            for(int j=i+2; j<n; j++)
                if(a[i]==a[j])
                    c=1;
        cout << (c ? "YES" : "NO"<< '\n';
        memset(a, 0sizeof(a));
    }
}
cs

C번

개구리가 0번 칸에 있고, n+1번째 칸까지 가려고 한다. 적힌 문자열에 따라 왼쪽, 오른쪽으로 k칸 이하만큼 가는데, 개구리가 최소 k칸을 뛰어야 n+1칸에 갈 수 있는가 즉, 최소의 k를 묻는 문제이다.

개구리가 최소 k칸 이하를 간다고 해도 반드시 오른쪽으로 가는 칸이 존재해야 한다. 따라서 해는 연속된 왼쪽 이동 칸의 최대 개수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
#define MEM 200005
#define sanic ios_base::sync_with_stdio(0);
using namespace std;
int t;
string s;
int dp[MEM];
int main()
{
    sanic;
    cin >> t;
    while(t--){
        int c=0;
        cin >> s;
        for(int i=0; i<s.size(); i++)
            if(s[i]=='L')
                dp[i+1= dp[i] + 1;
        for(int i=0; i<=s.size(); i++)
            c = max(c, dp[i]+1);
        cout << c << '\n';
        memset(dp, 0sizeof(dp));
    }
}
cs

D번

간단하게 말하면 걍 수열 a,b에서 ai+aj>bi+bj를 만족하는 i,j(i<j)에 대해 Σ(j-i)를 구하라는 문제이다.

수열 a,b의 차이를 저장해놓을 자료구조(stl::vector)를 잡아놓고,

이분탐색하면서 만족하는 i,j를 찾는다.

찾는 방법은 간단하다. 걍 차이 수열의 탐색중인 구간의 시작 인덱스, 끝 인덱스를 더해서 양수이면 만족하는 i,j를 찾은 것이나 마찬가지라고 볼 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
#define MEM 200005
#define sanic ios_base::sync_with_stdio(0);
using namespace std;
typedef long long ll;
vector<ll> v;
ll n,ans;
ll a[MEM], b[MEM];
int main()
{
    sanic;
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> a[i];
    for(int i=0;i<n;i++){
        cin >> b[i];
        v.push_back(a[i]-b[i]);
    }
    sort(v.begin(),v.end());
    int s=0,e=n-1;
    while(s<e){
        if(v[s]+v[e]>0){
            ans += e-s;
            e--;
        }
        else
            s++;
    }
    cout << ans;
}
cs