NOIP 2017普及グループ試験後のまとめ


  • 題記
  • エラー分析
  • 1score
  • 2librarian
  • 3chess
  • 4jump


  • ***
  • 1before
  • 2in the exam
  • 3now
  • 4future

  • 最後の
  • 題記(?)
    春節が過ぎたばかりの頃、金鶏の羽が2017年の青空の下で舞うことを祈ったのを覚えています.いくら計算しても、数日も経たないうちに新しい年になる.11月中旬、NOIPは秋の黄金色を騒がせた.
    エラー解析
    叙述する前に,まずまじめなことをしなさい.
    (1)score
    a,b,cに対してscore=20%a+30%b+50%cがあり、a,b,cが整数であることを保証する公式を与える.
    最初はdoubleのために慌てて、10数を見て笑って、書き始めました.
    freopen("score.in","r",stdin);
    freopen("score.out","w",stdout);
    scanf("%d%d%d",&Home,&Exam,&Test);
    gread=Home/5+Exam*3/10+Test/2;
    printf("%d",gread);

    第1題の点数はfreopenが間違っていない限り、間違っていなくても難しい.
    (2)librarian
    いくつかの図書番号を与え、要求された図書番号(複数ある)を入力し、その図書番号の末尾にあるすべての図書を探し出し、最小値をとる.
    一見、水題(実際にも)、直接暴力枚、試験が終わってパニックになった--intで書いた!!先頭0!!しかし、テストデータにはリーダー0がいません.データをありがとうございました.
    
    freopen("librarian.in","r",stdin);
    freopen("librarian.out","w",stdout);
    int n,p;
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++)
        scanf("%d",&books[i]);
    for(int i=1;i<=p;i++)
    {
        int Len,Pick,Min=10000001;
        bool flag=0;
        scanf("%d%d",&Len,&Pick);
        int Mod=pow(10,Len);
        for(int j=1;j<=n;j++)
            if(books[j]%Mod==Pick&&books[j]1;
            }
        if(!flag)
            printf("-1
    "
    ); else printf("%d
    "
    ,Min); }

    この問題は、ループ処理で、最大値を探して、普通は問題ありません.
    (3)chess
    中には3色の格子(赤、黄、白(白は直接歩けない))が入っています.異なる色の格子を通過する代価は異なる.2つの格子の色が同じなら、金貨を使う必要はありません.違うなら、金貨を1つ使う必要があります.2つの金貨を使って魔法をかけて、次の無色の格子を一時的に指定した色に変えます.つまり、この魔法を使って、この一時的に色のある格子に着いたら、魔法を使い続けることはできません.あなたが離れたときだけこの位置は、もともと色のある格子に着いたときに、この魔法を使い続けることができますが、この位置を離れたとき(魔法をかけて色のある格子にする)、この格子は無色に戻ります.
    この问题は私のパニックの始まりで、见てみると:深く探しますか.....考えてみれば、深く探して、私はできませんか、スキップしました....試験が終わったら、いいですね.
    void dfs(int x,int y,int c,int flag,int p)
    {
        if(f[x][y][c]==-1||f[x][y][c]>p)
            f[x][y][c]=p;
        else return ;
        if(x==m&&y==m) return ;
        for(int i=0;i<4;i++)
        {
            int x1=x+dir[i][0],y1=y+dir[i][1];
            if(x1>0&&y1>0&&x1<=m&&y1<=m)
            {
                if(A[x1][y1]+c==3) 
                    dfs(x1,y1,3-c,0,p+1);
                if(A[x1][y1]==c)
                    dfs(x1,y1,c,0,p);
                else
                    if(!flag)
                        dfs(x1,y1,c,1,p+2);
            }
        }
    }
    int ans=0x3f3f3f3f;
    scanf("%d%d",&m,&n);
    memset(f,-1,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        A[a][b]=c+1;
    }
    dfs(1,1,A[1][1],0,0);
    for(int i=1;i<=2;i++)
        if(f[m][m][i]!=-1)
            ans=min(ans,f[m][m][i]);
    if(ans==0x3f3f3f3f) puts("-1");
    else    printf("%d",ans);

    記憶化して深く探し、暴力で解決する.
    (4)jump
    1つの配列A[i]が与えられ、その中にいくつかの位置が踏んで、それに対応する分(スコアが負の可能性がある)を得ることができ、毎回選択して現在の位置からg個の位置を得ることができ、ジャンプ精度wを調整することによって、一定の距離を実現することができ、max(1,g−w+1)からg+wまでの位置に調整することができ、現在g,k,配列Aを与えることができる.問w最小でどれだけ踏んだ位置sum>kを使用できるかを問う.
    手に入れた、考えもしなかった、暴力DP--もともと正しい(30~40点)、もっと多くの点を考えて、位置を移した--間違って、5点、心理状態が爆発した.
    コード--ああ、まだ書いていません.
    ***
    1.before
    以前の私はどのようにプログラミングを学びましたか??毎日お昼に少し时间を割いて、机械の部屋の中でぼんやりと昼を浸すことができて、ACのいくつかの问题が自然に楽しくて、ACがなくてもただ“Let it be”で自分を慰めます.周末の授业が终わっても家に帰って「新しい思考」「金メダルの物理の试合」に头をぶら下げて、寝终わって、NOIPはまた1回です.
    2.in the exam
    思考が遅く、普段できる問題も「欲張り」で点数を落とした.得意ではない問題には挑戦できないが、実は簡単だ.
    3.now
    NOIPの激励のもとで、よく勉強します.
    4.future
    お昼、できるだけ問題を作って、本当にコードを見ることができなくて、数日後に暗記して打つことができます;授業を受けて、真剣に理解して、少なくとも基礎問題(難しい問題を作ったほうがいい)を確保します.週末に家に帰っても、必ず「新しい思考」の中で時間を割いて、勉強を続けます.
    最後に
    おめでとうございます.再戦、NOIP 2018.