월드컵

1109 단어 DP
환상 최장 비음자 서열
데이터가 100000이기 때문에 두 번 반복할 때 시간 초과가 필요합니다.
그리고 i번 도시가 1번 도시로 돌아갈 수 있도록.
따라서 dp[i]와 dp[i+ct]로 i번째 도시의 w-l를 표시한다
그래서 한 번만 훑어보면
num의 누적과 0보다 크면 된다
왜냐하면 가장 많이ct개 도시를 방문할 수 있으니까.
그래서 tmp>ct만 있으면 브레이크를 최적화할 수 있어요.
#include                                                                                                                               


int main ( ) {
    int ct, w, l, dp[210000], num;
    while ( scanf ( "%d", &ct ) != EOF ) {
        for ( int i = 1; i <= ct; ++i ) {
            scanf ( "%d%d", &w, &l);
            dp[i] = dp[i + ct] = w - l;
        }

        int tmp = 0, ans = 0;
        num = 0;
        for ( int i = 1; i <= ct * 2; ++i ) {
            num += dp[i];
            tmp++;
            if ( num < 0 ) {
                num = 0;
                tmp = 0;
            }
            if ( tmp > ans ) ans = tmp;
            if ( tmp >= ct ) break;
        }
        if ( ans > ct ) ans = ct;
        printf ( "%d
", ans ); } } ~

좋은 웹페이지 즐겨찾기