2018년 북우망 연구기 시험

48116 단어 OJ 퀴즈

문서 목록

  • Problem A
  • 입력
  • 출력
  • 샘플 입력
  • 샘플 출력
  • 코드
  • ProblemB
  • 입력
  • 출력
  • 테스트 데이터
  • 출력
  • 코드
  • Problem C. 24시
  • 제목설명
  • 입력
  • 출력
  • 예제
  • 코드
  • Problem D. 최대 가치
  • 입력
  • 출력
  • 테스트 데이터
  • 출력
  • 코드
  • Problem A


    슈퍼마켓과 유사하게 계산하여 구매한 상품의 총 가격을 계산하다.

    입력


    1차 비헤이비어 테스트 데이터 그룹 수 T(0
    각 조의 데이터는 첫 번째 행위로 상품의 종류 n을 구매한다. 다음 n행은 두 개의 데이터로 첫 번째는 상품 가격이고 두 번째는 상품 수량이며 가격은 실형이다.

    출력


    줄마다 대응하는 데이터의 총 가치를 출력하고 두 개의 소수를 보존한다.

    샘플 입력

    2
    2
    1.00  2
    0.50  2
    1
    100.0 1
    

    샘플 출력

    3.00
    100.00
    

    코드

    #include 
    #define FF(a,b) for(int a=0;a
    #define F(a,b) for(int a=1;a<=b;a++)
    #define LEN 200
    #define INF 100000
    #define bug(x) cout<
    
    using namespace std;
    typedef long long ll;
    const double pi=acos(-1);
    
    int main()
    {
        freopen("in","r",stdin);
        int T,N;
    
        scanf("%d",&T);
        while(T--){
            double sum=0;
            double t;
            int n;
            scanf("%d",&N);
            while(N--){
                scanf("%lf%d",&t,&n);
                sum+=t*n;
            }
            printf("%.2f
    "
    ,sum); } return 0; }

    ProblemB


    V자형 수열은 삼원조 a[j]와 a[k]>a[j]만 합치면 V자형 수열로 계산된다.

    입력


    1차 비헤이비어 테스트 데이터 그룹 수 T
    각 그룹 데이터의 첫 번째 동작 이 그룹의 숫자 개수
    다음 행위 그룹 요소

    출력


    대응하는 그룹의 v자형 수열에 맞는 개수를 출력합니다

    테스트 데이터

    2
    3
    2 1 2
    5
    2 1 2 1 2
    

    출력

    1
    4
    

    코드


    복잡성이 높아 최적화 필요
    #include 
    #define FF(a,b) for(int a=0;a
    #define F(a,b) for(int a=1;a<=b;a++)
    #define LEN 200
    #define INF 100000
    #define bug(x) cout<
    
    using namespace std;
    typedef long long ll;
    const double pi=acos(-1);
    
    int a[LEN];
    
    int main()
    {
        freopen("in","r",stdin);
        int T,N;
        scanf("%d",&T);
        while(T--){
            scanf("%d",&N);
            FF(i,N)
                scanf("%d",&a[i]);
            int ans=0;
            for(int i=1;i<N-1;i++){
                int n=0,m=0;
                for(int j=0;j<i;j++){
                    if(a[j]>a[i]){
                        n++;
                    }
                }
                for(int j=i+1;j<N;j++){
                    if(a[j]>a[i])
                        m++;
                }
                ans+=n*m;
            }
            printf("%d
    "
    ,ans); } return 0; }

    Problem C. 24 시


    제목 설명


    4개의 숫자를 입력하십시오. a, b, c, d.만약에 abcd=24라면 이 수조가 24점을 만족시킨다고 하는데 그 중에서 +, -, *,/어느 것이든지 할 수 있고 결과 24를 얻지 못하면 이 수조가 24점을 만족시키지 못한다고 한다.(실제 형식으로 계산됨)

    입력


    첫 번째 비헤이비어 테스트 그룹 수 t
    다음 t행, 매 행위 4개의 정수 a, b, c, d, 24점 만족 여부 테스트
    1<=a, b, c, d<10000(오른쪽 구간은 잊어버리고, 어쨌든 네 개의 수는 0이 아니다)

    출력


    줄마다
    만족하면 YES 내보내기
    불만족, 출력 NO

    예제

  • 입력
  • 3
    2 6 3 4
    1 1 2 3
    3 2 2 8
    
  • 출력
  • // 2+6*3+4
    Yes
    // 1 1 2 3
    No
    // 3*2/2*8
    Yes
    
    

    코드

  • 사고방식:
  • 피리칼 적(product)을 통해 4개의 조작부호에 대해 P(4,3)의 빈거 서열을 생성한다.
  • 각 그룹의 테스트 데이터에 대해 빈번한 조작부호 서열과 조작수를judge 함수에 가져와 판단
  • judge 함수에서 산자 우선순위에 따라 연산한다.
  • 확장
  • 피리칼적은 귀속으로 구조한다.시험장에서 생각이 나지 않으면 3중 순환을 사용할 수 있다.
  • 표현식 계산은 간략한 모델을 채택한다.파이톤의 eval처럼 계산해야 하는 경우 참조:https://blog.csdn.net/TQCAI666/article/details/88692096

  • OJ가 제출할 수 있는 것은 아니지만 구덩이를 기록하고 싶은데, 그것은 부동점수로 계산하는 것이 가장 좋다는 것이다
    #include 
    #define FF(a,b) for(int a=0;a
    #define F(a,b) for(int a=1;a<=b;a++)
    #define LEN 200
    #define INF 100000
    #define bug(x) cout<
    
    using namespace std;
    typedef long long ll;
    const double pi=acos(-1);
    
    int num[4];
    string a="+-*/";//   
    vector<string> ans;//    
    
    string ch2str(char fuck){
        char fuckYou[2]={0};
        fuckYou[0]=fuck;
        return fuckYou;
    }
    
    void product(int t,int n,int m){//P(n,m)
        if(t>=m){//      
            return;
        }else{
            vector<string> tmp;
            int sz=ans.size();
            if(sz){
                for(int i=0;i<n;i++){
                    for(int j=0;j<sz;j++){
                        tmp.push_back(ans[j]+a[i]);
                    }
                }
            }else{
                for(int i=0;i<n;i++){
                    tmp.push_back(ch2str(a[i]));
                }
            }
            ans=tmp;
            product(t+1,n,m);
        }
    }
    
    int operate(int &a,int& b,char op){
        int v;
        switch(op){
        case '+':
            v=a+b;
            break;
        case '-':
            v=a-b;
            break;
        case '*':
            v=a*b;
            break;
        case '/':
            v=a/b;
            break;
        }
        return v;
    }
    
    bool judge(string op,int*num){
        string opbk=op;
        string p="*/+-";//     
        vector<int> v(num,num+4);
        while(op.size()>0){
            FF(i,4){//            
                FF(j,op.size()){
                    if(p[i]==op[j]){
                        int ans=operate(v[j],v[j+1],op[j]);
                        v[j]=ans;
                        v.erase(v.begin()+j+1);
                        op.erase(j,1);
                        break;
                    }
                }
            }
        }
        //    
        if(v[0]==24){
            FF(i,3){
                cout<<num[i];
                cout<<opbk[i];
    
            }
            cout<<num[3]<<endl;
        }//end
        return v[0]==24;
    
    }
    
    int main()
    {
        freopen("in","r",stdin);
        int T,N;
        scanf("%d",&T);
        product(0,4,3);//    ,         ans
        while(T--){
            FF(i,4){
                scanf("%d",&num[i]);
            }
            bool yes=0;
            for(int i=0;i<ans.size();i++){//          
                string op=ans[i];
                bool pd=judge(op,num);
                if(pd){
                    yes=1;
                    break;
                }
            }
            puts(yes?"Yes":"No");
        }
        product(0,4,3);
        return 0;
    }
    
    

    Problem D. 최대 가치


    모든 부품에 적당한 온도 구간이 있다. [Ri, Ji]는 온도 tji가 되면 부품의 가치는 z이다.온도가 적당하면 가치는 y이다.그리고 y>x, y>z.지금 온도 t를 확인할 수 있는 항온 상자가 있습니다.

    입력


    첫 번째 줄은 순서대로 각각 n, x, y,z이다.0 다음 n 동작 각 부품의 적정 온도 구간 09

    출력


    온도치 t를 확정하여 이 온도에서 모든 부품의 총가치가 가장 크고 이 가치를 출력합니다

    테스트 데이터

    3 1 3 2
    1 4
    2 5
    7 10
    

    출력

    7    
    

    코드


    샘플을 통과할 수 있지만 AC의 복잡도가 가능한지 확실하지 않습니다. Nlog2N N∈[1200000)
    #include 
    #define FF(a,b) for(int a=0;a
    #define F(a,b) for(int a=1;a<=b;a++)
    #define LEN 200
    #define INF 100000
    #define bug(x) cout<
    
    using namespace std;
    typedef long long ll;
    const double pi=acos(-1);
    
    int main()
    {
        vector<int> left;//   
        vector<int> right;//   
        vector<int> node;//      
        freopen("in","r",stdin);
        int N,x,y,z,l,r;//0 < n <20000
        scanf("%d%d%d%d",&N,&x,&y,&z);
        FF(i,N){
            scanf("%d%d",&l,&r);
            left.push_back(l);
            right.push_back(r);
            node.push_back(l+1);//        
            node.push_back(r-1);
        }
        sort(left.begin(),left.end());
        sort(right.begin(),right.end());
        sort(node.begin(),node.end());
        int ans=0;
        FF(i,node.size()){
            int cur=node[i];
            vector<int>::iterator it;
            //     
            it=upper_bound(right.begin(),right.end(),cur);
            int lCnt=distance(right.begin(),it);
            //     
            it=lower_bound(left.begin(),left.end(),cur);
            int rCnt=distance(it,left.end());
            int cCnt=N-lCnt-rCnt;
            int sum=rCnt*x+cCnt*y+lCnt*z;
            ans=max(ans,sum);
        }
        printf("%d
    "
    ,ans); return 0; }

    좋은 웹페이지 즐겨찾기