728x90
반응형

https://www.acmicpc.net/problem/2531

 

2531번: 회전 초밥

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

www.acmicpc.net

 

[ 백준 2531번 회전초밥 / 백준 15961번 회전초밥 소스 코드 ]

#include <iostream>

int data[ 3000000 ] = { 0 };
int ch[ 6000 ] = { 0 };

int main()
{
    int N, d, k, c;
    int t1 = 0, ans = 0;

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

    for(int i = 0; i < k; i++)
    {
        scanf("%d\n", &data[ i ]);

        if(!ch[ data[ i ] ] && data[ i ] != c)
        {
            t1++;
        }

        ch[ data[ i ] ]++;
    }

    ans = t1;

    for(int i = 0; i < N - k; i++)
    {
        scanf("%d\n", &data[ i + k ]);
        ch[ data[ i ] ]--;

        if(!ch[ data[ i ] ] && data[ i ] != c)
        {
            t1--;
        }

        if(!ch[ data[ i + k ] ] && data[ i + k ] != c)
        {
            t1++;
        }

        ch[ data[ i + k ] ]++;

        if(t1 > ans)
        {
            ans = t1;
        }
    }

    for(int i = N - k; i < N - 1; i++)
    {
        ch[ data[ i % N ] ]--;

        if(!ch[ data[ i % N ] ] && data[ i % N ] != c)
        {
            t1--;
        }

         if(!ch[ data[ (i + k) % N ] ] && data[ (i + k) % N ] != c)
        {
           t1 ++;
        }

        ch[ data[ (i + k) % N ] ]++;

        if(t1 > ans)
        {
            ans = t1;
        }
    }

    printf("%d\n", ans + 1);

    return 0;
}
반응형
Posted by 명문코딩컴퓨터
,