혜성 OJ - 경연 대회 # 10 B 제목의 아름다움

### 주제 링크 ###

 

타이틀 효과 : 와 N은 양의 정수, 구문, 숙어 같은 양의 정수를 각각 나타내는 양의 정수. 단지의 최대 양의 정수는 세 번 나타납니다.

구성은 상대하는 이러한 구성은 동일한 관용구 최소 간격, 최대, 최소 간격의 출력의 최대 값.

관용구의 수와 동일한 간격을두고 중간 관용구.

특히, 각각의 구문 한번만 나타날 때, 최소 간격의 최대 값을 고려  N-  .

 

분석 :

1, 숙어의 최대 개수가 발생할 경우 2시있다 : 예를 들어, 두 개의 서로 다른 숙어 (12)이 있으며, 그들은 최소 간격을하기 위해 최대 수에 회 나타난 가장 구조는 두 개의 1 개의 간격 같다 2 구간.

       XXXXX 1 2 1 2 (다른 숙어 대신 X)

그래서 당신은 숙어 두 번 등장 할 수 있음을, 그 간격은 작은을 가지고 있지 않는, 동일합니다. 그런 다음 입술 = 숙어의 수는 한 번만 표시하자, 숙어의 두 가지 유형의 번호를 설정 = 발생합니다.

입술 = N - 2가, * 응답은 : RES + (A -. 1) .

 

2, 다음 문구가 표시되지는 수 2, 수 있도록 구성 할 수 있습니다, 3이 나타납니다.   

1 2 3 1 2 3 XXX XX 1 2 3

사용자가 X (X = 5) 양측 서브 - 계정 때문에 최소 123 간격 세 숙어 확실히 적은 쪽을 가지고이 홀수인지, 동일한 것을 확인할 수 있도록 매우 작은 이쪽의 최소 간격이다.

해상도는 = 숙어의 설정 번호는 숙어 종류의 = 수는 3 번 나타납니다, 한 번 나타납니다. 입술 = N - 3은 * 응답은 : 입술 + (a - 1) .

 

3, 다음, 두 번 모두 숙어의 다른 세 가지 모습을 위해, 당신은 또한 이데올로기 적 구조 위를 사용할 수 있습니다 :

최대 간격을 최소화하고, 대 위해 이디엄은 대부분의 중간 바람직 오른쪽에서 최 좌측에 세 번, 나타나기 때문에. 제한 "중간 세 번째 관용구는"다음 관용구가 세 번 나타날 간격의 수를 증가시키기 위해,이 없기 때문에 문구에 관해서는, 두 번 표시, 가장 좋은 방법은 가장 다음 세 가지 오른쪽 배수 나타납니다의 관용구 왼쪽되며, 관용구는 행에 두 번 밖에 나타납니다.

예를 들어, 세 번 등장했다 : 123, 45에 두 번 나타납니다.

1 2 3 4 5 1 2 3 XX XXX 4 5 1 2 3

최대 1, 2, 2, 3 (3)의 최소 간격을 보장하기 위해 가능한 한 작은은 (동일 간격으로되는 상기 두 동일 관용구)가 최소 간격과 동일 그러한

그러나 제한 아이디어가있다 : 숙어 수 많은 후 동시에 추구하고, 세 번, 가까운 중간에 이동해야 할 모습 관용구가 적은 두 번 간격 간격 문구보다 것이다 만들 수 있습니다 그들을 일으키는 두 번 표시 나타나는 경우 분 이동합니다.

입술 = 숙어의 세트 수가 숙어 가지 X = 다수 번 나타날 나타나는 회, Y는 = 숙어의 가지 수는 3 번 나타난다.

있다 : 입술 = N - 2 * X - 3 * (Y), 응답은 : 분 (RES X + Y + - . 1, RES / 2 + X + Y - . 1)

(두 숙어 게재 최소 간격) HHH 분 후이,이 식으로부터 실제로 무용 알 수있다, 권리 (관용구 세의 최소 간격을 표시) 왼쪽보다 작아야한다.

 

다음 데이터 양 때문에, 숙어의 수는 열려있는지도 또는 분리하지 않는 나타 기록합니다.

다음과 같이 코드입니다 :

 

사용법 #include <iostream> 
#INCLUDE <알고리즘>
 사용  스페이스 성병;
INT N;
int로 이 [ 100008 ], B [ 100008 ], C [ 100008을 , 힘 [ 100008 ];
int로 주 () 
{ 
    는 scanf ( " %의 D ' , N)을;
    위한 ( INT 난 = 1 ; I <= N; I ++ ) { 
        scanf와 ( " 가 % d " , & A [I])를; 
        B [I] = A [I]; 
    } 
    정렬 (ㄱ +1 , B + N + 1 );
    INT LEN 고유 = (B + 1 , B + N + 1 ) - (B) - 1 ;
    위한 ( INT 난 = 1 C [I] = LOWER_BOUND (b +; I <= N I ++) 1 , B + LEN + 1 , A [I]) - (B), 힘 [C [I] ++ 단계; // 离散化
    INT X = 0 , Y = 0 ;
    위한 ( INT 난 = 1 ; I <= LEN; I ++ ) {
         경우 (힘 [I] == 2 ) X ++ ;
        다른  경우 (힘 [I] ==3 ) Y ++ ; 
    } 
    INT의 입술, ANS;
    경우 ((X) && (! Y)) { 
        ANS = N; 
    } 
    다른  경우 (X && (! Y)) { 
        입술 = N - 2 * X; 
        ANS = 입술 + X - 1 ; 
    } 
    다른  경우 ((X) &&! Y) { 
        입술 = (N - 3 * Y) / 2 ; 
        ANS = 입술 + Y - 1 ; 
    } 
    다른 { 
        고해상도 = N -2 * X - 3 * Y;
        // ANS = 분 (입술 + Y + X - 1, 입술 / 2 + X + Y - 1); 
        세 = 입술 / 2 + X + Y - 1 ; 
    } 
    의 printf ( " 가 % d \ n " , 년); 
}

 

 

 

 

 

추천

출처www.cnblogs.com/Absofuckinglutely/p/11887389.html