[Luogu의 P1080] 킹스 게임

얼굴 질문

제목 설명

일치 \ (H \) 국가의 날, 왕은 초대 (N \) \ 경품 게임을 장관. 첫째, 그는 각각의 상단에 왼쪽과 오른쪽에 각각 목사는 자신이 각은 오른쪽에 정수를 쓰기 왼쪽 된 정수 왕을 작성 할 수 있습니다. 그런 다음,하자 \ (n \) 행의 장관을, 왕이 앞 순위에 서 있었다. 줄 지어 후, 모든 장관들이 금화 왕 보상의 번호를 받게됩니다, 각 장관에 대한 동전의 수를 얻었다 : 오른손의 숫자로 나눈 수의 장관 모두의 앞에 왼쪽에있는 행의 제품, 얻어진 정수 결과는 내림된다.

왕은 그가 그렇게 가장 보상 장관을 얻기 위해, 그 팀의 순서를 재 배열 도움을 요청하고 싶은, 그래서 가능한 한 적게 보상을받은 목사는 특히 큰 상을 얻을하지 않습니다. 왕의 위치가 항상 앞 순위에있다합니다.

입력 형식

첫 번째 라인은 정수 포함 \ (N- 형 \)을 장관의 수를 나타낸다.

두 번째 행은 두 정수 포함 \ (A \)\ (B \) 사이의 공간으로 구분하여, 각 오른쪽 및 왼쪽 왕의 정수를 나타낸다.

다음 \ N- (\) 행 두 정수를 포함하는 각 행 \ (A \)\ (B \) 사이의 공간으로 구분하여, 각 각 좌우에 장관 정수를 나타낸다.

출력 형식

얻은 금화 장관의 가장 번호를 재 배열 투어 우승 후 팀을 나타내는 정수입니다.

샘플 입출력

입력 # 1

3 
1 1 
2 3 
7 4 
4 6 

출력 # 1

2

설명 / 팁

예 설명 [O]

장관을 눌러 1,2,3 얻을 동전의 보상을 최대 수는 2 등 팀을 구성;

장관을 눌러 1,3,2 얻을 동전의 보상을 최대 수는 2 등 팀을 구성;

장관을 눌러 2,1,3 얻을 동전의 보상을 최대 수는 2 등 팀을 구성;

보도 2,3,1 등 팀, 9 보상 장관을 얻은 동전의 가장 큰 수를 배열;

장관을 눌러 3,1,2 얻을 동전의 보상을 최대 수는 2 등 팀을 구성;

이 배열 팀 3,2,1 장관은 금화 가장 많은 9 얻은 보상.

따라서, 가장 보람 장관은 두 개 이상의 금화, 응답 출력 2를 얻을.

[데이터 범위]

들면 \ (20 % \ \) 의 데이터가있다 . (1 \ n 르 \ 르 10 \) \ , \ (0 <A, B <8 \.) ;

내용 (40 \ % \) \ 데이터있다 . (1 \ n 르 \ 르 20 \이다) \ , \ (0 <A, B <8 \.) ;

내용 (60 \ % \) \ 데이터있다 \ (1 \ n 르 \ 르 100 \.) ;

내용 (60 \ % \) \ 데이터 응답이 초과하지 않도록 \ (10 ^ 9 \) ;

내용 (100 \ % \) \ 데이터있다 \. (1 \ n 르 \ 르 1000 \) , \ (0 <A, B <10000 \) .

NOIP 2012 년 두 번째 질문의 첫 날 세트를 개선하기 위해

분석

이 질문은 매우 장관, 왕이, 왼손 ...... 몽골 원, 죽음의 무리를 혼란 것처럼 보일 수 있습니다.
그러나 대부분의 내가 Tucao 원하는 아직 자신의 목표를 달성 할 수있는 0을 기록하지 않습니다 왼쪽에 왕
음, 우리는 먼저 장관, 왕의 무리를 보이지 않는해야하며, 장관은 그 뒤에 두보고, 그것을 분석 할 수 있습니다.
열 테이블 :

정체 왼손 오른쪽의
\ (a_0 \) \ (b_0 \)
대신 1 \ (A_1 \) \ (B_1 \)
대신 2 \ (A_2 \) \ (B_2 \)

많은 금을 얻을 수 있습니다, 장관 1을 분석?
분명하다 \ (\ FRAC {} \ {B_1 a_0}) ,
장관이 얼마나 많은 금을받을 수 있나요?
\ (\ {B_2} \ {FRAC * A_1 a_0}) ,
이때, 우리 두 장관 금화의 최대 숫자로 지칭 (ans_1 \) \ 다음 분명히 존재
\ [ans_1 = 최대 (\ FRAC {a_0} { B_1} \ {a_0 FRAC * A_1} {} B_2) \]

그런데 지금 우리는 총리와 장관 (1) (2)를 교환합니다.

정체 왼손 오른쪽의
\ (a_0 \) \ (b_0 \)
대신 2 \ (A_2 \) \ (B_2 \)
대신 1 \ (A_1 \) \ (B_1 \)

이때 역시 장관 얻을 수 1 \ (\ {B_1} \ {FRAC * A_2 a_0}) ,
장관 얻을 수 2 \ (\ FRAC a_0} {} {B_2 \) .
우리가 쓰기 금화의 두 장관 가장 많은이 시간 \ (ans_2 \) , 다음 분명히있다
\ [ans_2 = 최대 (\ FRAC {a_0 * A_2} {B_1}, \ FRAC {a_0} {B_2}) \] .

모양과 비교 :
\ [ans_1 = 최대 (\ FRAC B_1} {} {a_0 \ FRAC * a_0 A_1} {} {B_2) \]
\ [ans_2 = 최대 (\ * A_2 {a_0 FRAC} {} B_1 \ {FRAC a_0 B_2} { }) \]

제목은 모든 장관이 왼쪽과 오른쪽 숫자는 정수 말했다되었습니다.
그래서 아주 분명히, \ (\ FRAC {a_0} {B_1} \ 르 \ FRAC {a_0 * A_2} {B_1} \)\ (\ FRAC {a_0} { B_2} \ 제작 : \ FRAC {a_0 * A_1} {B_2 } \) .
그러나 단순히 미친 식의 덩어리로 같은 길이의 지루한와. 그것을 어떻게? 단어는 설정 !
식사 미친 설정, \ (\ FRAC a_0 {} {} B_1 \) 로 설정 \ (P_1 \) , \ (A_1 a_0 \ * FRAC} {} {B_2는 \) 로 설정 \ (P_2 \) , \ (\ FRAC * {a_0 A_2 B_1} { } \) 로 설정된다 (\ P_3 \) \ (\ FRAC a_0 {} {}는 B_2 \) 로 설정된다 (\ P_4 \) .
그런 다음이 \ (P_1 \ 르 P_3 \) , \ (P_4 \ 르 P_2 \) .
이 공식은 즉시 많은 상쾌한.
우리가 원하는 경우 (ans_1 \) \ 말을하는 것입니다 최적의 솔루션입니다 \ (ans_1 \ 르 ans_2 \)당신은 어떻게해야합니까?
혀의 혀가,,, 쉬운 핸들에 보이지 않는
중요하지 않습니다, 우리가 할 수있는 \ (P_1, P_2, p_3, p_4 \) 함께,우글 거리다자신의 최대 값을 구한다.
하, 당신이 볼 \ (P_1 \ 르 P_3 \) , \ (P_4 \ 르 P_2 \) ,
최대 비 사용할 수 있도록 (\ P_1를) \ , \ (P_4 \) 방법 우리는 제외하는 것이.
에서 왼쪽 \ (ans_1 \) 입니다 \ (P_2 \) 과에서 \ (ans_2 \) 입니다 \ (P_3 \) .
그러나 우리는 보장 말한 (ans_1 \ 르 ans_2 \) \ 우리가 할 수 있어야하므로, \ (P_2 \ 르 p_3 \) 이 결과를 보장하기 위해.
음, 우리는 가지고 원칙 욕심 \ (P_2 \ 르 P_3을 \) .
이 시점에서 \ (p \) 임무 종료, 작별을, 우리는 점차적으로 원래의 스타일 교환한다.
\ [P_2 \ 르 P_3 \]
\ [\ {a_0 FRAC * A_1 B_2} {} \ 르 \ {a_0 FRAC * A_2 B_1} {} \]
우리 승산하면서 여기 양측 \ (\ {B_1 FRAC * B_2 } a_0} {\) .
\ [A_1 * B_1 \ 르 A_2
* B_2 \] 여기, 그것은 욕심 종류의 모든 것을 분명하다, 우리는이 관계를 따라야합니다 ok.
뿐만 아니라 노트에 요점은 쉽게 데이터 범위에서 볼 것은 카드의 종류 수 있다는 것입니다 ull! cpp플레이어는 우리가 단지 사용, 눈물을 터뜨렸다 높은 정밀도 를!
또한 참고로 포인트 즉 마지막 장관 정말 인기가 있지만, 마지막 장관의 출력을하지 않습니다, 당신은 그 정확성을 입증 할 방법이 없습니다. 이 방법은 90 분 걸릴 수 있습니다.
참고로 한 가지를 하는것, 왕이 처음부터 항상, 그것은 욕심 종류에 포함 할 수 없습니다. 이 때문에, 나는 80 분 걸렸다좋은 결과.
중요한 점은 말했다 및 완료, 우리는 바코드에 있습니다.

 코드   

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2020-02-05 00:19:09 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2020-02-05 00:56:58
 */
#include <bits/stdc++.h>
using namespace std;

int n,m;
const int maxn=1005;
const int maxh=20005;

struct gamer{
    long l,r;
    bool operator<(const gamer a) const{
        return l*r<a.l*a.r;
    }
}gamers[maxn];

string mul(string a,string b){
    int alen=a.size();
    int blen=b.size();
    int res[maxh]={0};
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    for(int i=0;i<alen;i++)
        for(int j=0;j<blen;j++)
            res[i+j]+=(a[i]-'0')*(b[j]-'0');
    for(int i=0;i<alen+blen;i++)
        if(res[i]>=10){
            res[i+1]+=res[i]/10;
            res[i]%=10;
        }

    string ret="";
    bool frontzero=true;
    for(int i=alen+blen-1;i>=0;i--){
        if(!res[i]&&frontzero) continue;
        frontzero=false;
        ret+=res[i]+'0';
    }
    return ret;
}

string div(string a,int b){
    int res[maxh]={0},resa[maxh]={0};
    int len=a.size();
    for(int i=0;i<len;i++)
        res[i+1]=a[i]-'0';
    int tmp=0;
    for(int i=1;i<=len;i++){
        resa[i]=(tmp*10+res[i])/b;
        tmp=(tmp*10+res[i])%b;
    }

    int start=1;
    string ret="";
    while(!resa[start]&&start<len) start++;
    for(int i=start;i<=len;i++)
        ret+=resa[i]+'0';
    return ret;
}

string max(string a,string b){
    if(a.size()!=b.size()) return a.size()>b.size()?a:b;
    return a>b?a:b;
}

string i_to_s(int x){
    string ret="";
    do{
        ret+=x%10+'0';
    }while(x/=10);
    reverse(ret.begin(),ret.end());
    return ret;
}

int main(){
    scanf("%d",&n);
    for(int i=0;i<=n;i++)
        scanf("%ld%ld",&gamers[i].l,&gamers[i].r);
    sort(gamers+1,gamers+n+1);

    string ans="0";
    string tmp=i_to_s(gamers[0].l);

    for(int i=1;i<=n;i++){
        ans=max(ans,div(tmp,gamers[i].r));
        tmp=mul(tmp,i_to_s(gamers[i].l));
    }

    cout<<ans<<endl;
    return 0;
}

 평가 결과     

왕이 위치를 변경할 수 없기 때문에 80 점은 발견되지 않았다
(100) AC의를

over.

추천

출처www.cnblogs.com/crab-in-the-northeast/p/luogu-p1080.html