ACM준비/기타

회전 초밥(고등)

조규현15 2015. 7. 7. 18:08
반응형

https://codeup.kr/problem.php?id=4752 

 

회전 초밥(고등)

첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 $N$ , 초밥의 가짓수 $d$, 연속해서 먹는 접시의 수 $k$,쿠폰 번호 $c$가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, $2<=N<=3,000,000 , 2<=d<=3,000

codeup.kr

1차원 배열에 현재 index의 초밥을 확인하며 테이블 배열에 더하거나 빼주면 된다.

 

#include <stdio.h>

int AN[3000001];

int TABLE[3001] = {
    0,
};

int IsOK(int type, int value)
{

    if (type)
    {

        // plus

        ++TABLE[value];

        if (TABLE[value] == 1)

            return 1;

        return 0;
    }

    else
    {

        // minus

        --TABLE[value];

        if (TABLE[value] == 0)

            return -1;

        return 0;
    }
}

int main()

{

    int N, d, k, c;

    int BN, bn = 0;

    int i;

    scanf("%d %d %d %d", &N, &d, &k, &c);

    // 0st input < bonus 'c' >

    bn += IsOK(1, c);

    for (i = 0; i < N; ++i)
    {

        scanf("%d", &AN[i]);

        // first input < 0 ~ k >

        if (i < k)

            bn += IsOK(1, AN[i]);
    }

    // initialize Biggest Number

    BN = bn;

    // second input < k ~ N+k >

    for (i = k; i < N + k; ++i)
    {

        if (i < N)
        {

            bn += IsOK(0, AN[i - k]);

            bn += IsOK(1, AN[i]);
        }

        else
        {

            bn += IsOK(0, AN[i - k]);

            bn += IsOK(1, AN[i - N]);
        }

        // compare Biggest Number

        if (BN < bn)

            BN = bn;
    }

    // answer

    printf("%d\n", BN);

    return 0;
}
반응형

'ACM준비 > 기타' 카테고리의 다른 글

DEVDAY2013 계단  (0) 2015.01.08
Playing with Wheels  (0) 2015.01.08
Bicoloring  (0) 2015.01.08
Complete Tree Labeling  (0) 2015.01.08
Self-describing Sequence  (0) 2015.01.08