Outdated/Algorithm Solution

[BOJ] 1024번 수열의 합

해달 2020. 3. 23. 18:00

복기

가우스 수열...정말..


코드

  • C++ 17


#include <iostream>

 

using namespace std;

 

int N, L;

 

int main()

{

    ios::sync_with_stdio(false);

    cin.tie(nullptr);

    cout.tie(nullptr);

 

    cin >> N >> L;

    // 이 문제는 가우스 수열을 이용해야 한다.

    // N을 L개의 수열로 구성한다고 할 때,

    // 1. L이 홀수라면

    // 중간 값을 K라고 할 때, 수열은 다음과 같은 형식이 된다.

    // K - A, K - A + 1, ... , K , ... , K + A - 1, K + A (A = (L - 1) / 2)

    // 위의 수열을 역순으로 배치한 수열과 더해주면 2KL = 2N 즉, KL = N이 된다.

 

    // 2. L이 짝수라면

    // 위와 마찬가지로 중간 값을 K라고 할 때, 수열은 다음과 같은 형식이 된다.

    // K - A, K - A + 1, ..., K, K + 1, ..., K + A, K + A + 1 (A = L / 2 - 1)

    // 가우스 수열로 더해주면 2(2K + 1)L = 2N 즉, (2K + 1)L = N이 된다.

    for (int i = L; i <= 100; ++i)

    {

        int k, a;

 

        if (i % 2 == 0)

        {

            if (N % i != i / 2)

                continue;

            k = N / i;

            a = k - (i - 1) / 2;

        }

        else

        {

            if (N % i != 0)

                continue;

            k = N / i;

            a = k - i / 2;

        }

 

        if (a >= 0)

        {

            for (int j = 0; j < i; ++j)

                cout << a + j << ' ';

            return 0;

        }

        else

            break;

    }

    

    cout << -1;

}


  • C# 6.0


using System;

 

namespace Csharp

{

    class Program

    {

        static int N, L;

        

        static void Main(string[] args)

        {

            var inputs = Console.ReadLine().Split();

            N = Convert.ToInt32(inputs[0]);

            L = Convert.ToInt32(inputs[1]);

 

            for (int l = L; l <= 100; ++l)

            {

                int k, a;

 

                if (l % 2 == 0)

                {

                    if (N % l != l / 2)

                        continue;

                    k = N / l;

                    a = k - (l - 1) / 2;

                }

                else

                {

                    if (N % l != 0)

                        continue;

                    k = N / l;

                    a = k - l / 2;

                }

 

                if (a >= 0)

                {

                    for (int i = 0; i < l; ++i)

                        Console.Write($"{a + i} ");

                    return;

                }

            }

 

            Console.WriteLine(-1);

        }

    }

}


  • Python 3


from sys import stdin

input = stdin.readline

 

N, L = map(int, input().split())

 

for l in range(L, 100 + 1):

    k, a = 0, 0

 

    if l % 2 == 0:

        if N % l != l // 2:

            continue

        k = N // l

        a = k - (l - 1) // 2

    else:

        if N % l != 0:

            continue

        k = N // l

        a = k - l // 2

 

    if a >= 0:

        print("".join(

            [ f'{a + i} ' for i in range(l) ]

        ))

        exit()

    else:

        break

 

print(-1)


'Outdated > Algorithm Solution' 카테고리의 다른 글

[BOJ] 3101번 토끼의 이동  (0) 2020.04.13
[BOJ] 4948번 베르트랑 공준  (0) 2020.04.13
[BOJ] 1676번 팩토리얼 0의 개수  (0) 2020.03.23
[BOJ] 2660번 회장 선출  (0) 2020.03.19
[BOJ] 1991번 트리 순회  (0) 2020.03.19