9도 OJ 1131: 합창대형(DP, 최장 상승 하강 서열)

2690 단어 dpC 언어OJ9도
시간 제한: 1초
메모리 제한: 32메가
특수 판제:아니오
제출: 2865
해결: 881
제목 설명:
N명의 학우들이 한 줄로 서 있는데 음악 선생님은 그 중의 (N-K) 학우들을 불러서 나머지 K명의 학우들이 자리를 바꾸지 않고 합창 대형을 만들 수 있도록 해야 한다.합창대형은 K명의 학우를 왼쪽에서 오른쪽으로 순서대로 번호가 1,2,...,K로 하고 그들의 키가 각각 T1,T2,...,TK로 하면 그들의 키는 T1Ti+1>...TK(1<=i<=K)를 만족시킨다.너의 임무는 모든 N명의 학우들의 키를 알고 있기 때문에 최소한 몇 명의 학우들이 줄을 서서 나머지 학우들을 합창 대형으로 배열할 수 있도록 계산하는 것이다.
입력:
입력한 첫 번째 행은 전체 학생 수를 나타내는 정수 N(2 <= N <= 100)입니다.첫 줄에는 n개의 정수가 있고 빈칸으로 구분되며 i번째 정수인 Ti(130<=Ti<=230)는 i번째 동창의 키(센티미터)다.
출력:
여러 그룹의 테스트 데이터를 포함할 수 있고 각 그룹의 데이터에 대해 출력은 한 줄을 포함한다. 이 줄은 하나의 정수만 포함하는데 적어도 몇 명의 학우가 열을 내야 한다.
샘플 입력:
8
186 186 150 200 160 130 197 220

샘플 출력:
4

출처:
2008년 북경대학 방정실험실 컴퓨터 연구 생기 시험 진제
아이디어:
동적 기획은 i개수를 가장 오른쪽 수로 하는 최장 상승 서열과 i개수를 가장 왼쪽 수로 하는 최장 하강 서열을 구한다.
마지막으로 i개수가 가장 높은 수의 최장자 서열 길이를 구한다.나머지는 바로 줄을 서야 하는 학우들이다.
최장 상승 서열은 더 좋은 해결 방법이 있다.
코드:
#include <stdio.h>
 
#define N 100
 
int big[N], count;
int up[N], down[N];
 
void print(int x[N], int c)
{
    for (int i=0; i<c; i++)
        printf("%d ", x[i]);
    printf("
"); } int binSearch(int begin, int end, int k) { if (end == -1) return -1; if (begin == end) { if (big[begin] < k) return begin; else return -1; } int mid = (begin+end)/2; if (big[mid+1] >= k) return binSearch(begin, mid, k); else return binSearch(mid+1, end, k); } int insert(int k) { int j; j = binSearch(0, count-1, k); //printf("j=%d, count=%d
", j, count); if (j == count-1 || big[j+1] > k) { big[j+1] = k; if (j == count-1) count ++; } //print(big, count); return j+2; } int main(void) { int a[N], n, i; while (scanf("%d", &n) != EOF) { for(i=0; i<n; i++) scanf("%d", &a[i]); count = 0; for(i=0; i<n; i++) up[i] = insert(a[i]); count = 0; for(i=n-1; i>=0; i--) down[i] = insert(a[i]); int max = 0; for (i=0; i<n; i++) { if (up[i]+down[i] > max) max = up[i]+down[i]; } printf("%d
", n-max+1); } return 0; } /************************************************************** Problem: 1131 User: liangrx06 Language: C Result: Accepted Time:350 ms Memory:916 kb ****************************************************************/

좋은 웹페이지 즐겨찾기