NOIP2017普及組比賽總結

期中考總結&NOIP2017總結html

2017年11月11日,我第二次參加NOIP普及組複賽。上一年,個人得分是250分,只拿到了二等獎。我便把目標定爲拿到一等獎,考到300分以上。函數

早上8點多,咱們去302教室,聽同窗講考試注意事項(有十幾條),有兩條令我受益不淺——要吃飽;不要定義與自帶函數重名的變量或函數(如x0,y0什麼的)。優化

咱們看了本身的考試信息後,就上車了。11點多就到達廣州了。spa

吃中午餐的地方是一間名叫都城快餐的快餐店,咱們卻吃了一個多小時的快餐(有人等飯等了四十多分鐘)code

吃完飯後,咱們走去廣州六中,接着在那裏休息(睡午覺)。2點鐘就去考場了。htm

比賽2點半開始,6點鐘結束。開始考試後,我用了40分鐘看了一下題目。blog

T1:
哇!好水呀!
直接輸出\({\frac{2a}{10}+\frac{3b}{10}}+\frac{5c}{10}\)不就完事了嗎?
這題不會那麼水的!我又看了看題,確保萬無一失,以防把這唾手可得的100分弄丟了。
而後就AC了。get

T2:
嗯,挺水的。
一眼出正解——暴力!
個人方法就是暴力,只不過加了一點優化(由於比賽時我擔憂此題有坑)
考場AC!
PS:此題用字典樹是最快的。io

T3:
一開始想到了DFS,又想到了DP,到了動手作題前,才發現DP過不了,就打了個記憶化搜索。ast

相信許多人都以爲魔法特難搞,其實並不難。

經過找規律,咱們不難發現,從有顏色的格子開始走,能夠走到任意格子,無論它有沒有顏色。

而沒有顏色的格子卻只能走到那些有顏色的格子上(不能連續兩次用魔法)

那怎麼計算使用魔法的花費呢?我發現,能夠分紅兩種狀況判斷:

而後記錄一下上一個格子座標就行了。
考場AC!
T4:
這題我0分,題解見http://www.javashuo.com/article/p-aspguvkr-mk.html


比賽結束後,我忐忑不安地離開考場。不知道今年我能考到多少分呢?應該是310~320吧(然而只拿了300分)!
晚飯咱們不是在都城快餐吃了,咱們去到了一間飯店吃。不知爲什麼,老師點了特別多的菜,每一桌的菜數比人數還要多!
最後咱們固然是沒吃完的。有詩云:

鋤禾日當午,汗滴禾下土。
誰知盤中餐,粒粒皆辛苦。

個人良心受到了譴責!


代碼

T1:

#include<cstdio>
using namespace std;
int main()
{
    freopen("score.in","r",stdin);
    freopen("score.out","w",stdout);
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    printf("%d\n",a/10*2+b/10*3+c/10*5);
    return 0;
}

T2:

#include<cstdio>
using namespace std;
int a[1010],s[11];
void qsort(int l,int r)
{
    int i=l,j=r,mid=a[(l+r)/2],t;
    while(i<=j)
    {
        while(a[i]<mid) i++;
        while(a[j]>mid) j--;
        if(i<=j)
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
            i++;j--;
        }
    }
    if(i<r) qsort(i,r);
    if(l<j) qsort(l,j);
}
int main()
{
    freopen("librarian.in","r",stdin);
    freopen("librarian.out","w",stdout);
    int n,q,i,j=0,need,len,k=1;
    bool haveFind_theBook;
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;i++) scanf("%d",&a[i]);
    qsort(1,n);
    for(i=0;i<11;i++) s[i]=1;
    for(i=1;i<=n;i++)
    {
        while(a[i]>=k)
        {
            j++;s[j]=i;
            k=k*10;
        }
    }
    while(q--)
    {
        scanf("%d%d",&len,&need);
        if(len==0)
        {
            printf("-1\n");
            continue;
        }
        k=1;haveFind_theBook=false;
        for(i=1;i<=len;i++) k=k*10;
        for(i=s[len];i<=n;i++)
        {
            if(a[i]%k==need)
            {
                haveFind_theBook=true;
                printf("%d\n",a[i]);
                break;
            }
        }
        if(!haveFind_theBook) printf("-1\n");
    }
    return 0;
}

T3:

#include<cstdio>
using namespace std;
#define maxlongint 0x7fffffff
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
int n,c[101][101],f[101][101];
void dfs(int x,int y,int cost,int X,int Y)
{
    if(f[x][y]<=cost) return;
    f[x][y]=cost;
    int i,xx,yy;
    for(i=0;i<4;i++)
    {
        xx=x+dx[i];yy=y+dy[i];
        if(xx>0&&yy>0&&xx<=n&&yy<=n)
        {
            if(c[x][y]==0)
            {
                if(c[xx][yy]==0) continue;
                else
                {
                    if(c[X][Y]==c[xx][yy])
                    {
                        dfs(xx,yy,cost,1,1);
                    }
                    else dfs(xx,yy,cost+1,1,1);
                }
            }
            else
            {
                if(c[xx][yy]==0)
                {
                    dfs(xx,yy,cost+2,x,y);
                }
                else
                {
                    if(c[x][y]==c[xx][yy])
                    {
                        dfs(xx,yy,cost,1,1);
                    }
                    else dfs(xx,yy,cost+1,1,1);
                }
            }
        }
    }
}
int main()
{
    freopen("chess.in","r",stdin);
    freopen("chess.out","w",stdout);
    int m,i,j,x,y,z;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        c[x][y]=z+1;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            f[i][j]=maxlongint;
        }
    }
    dfs(1,1,0,1,1);
    if(f[n][n]==maxlongint) printf("-1\n");
    else printf("%d\n",f[n][n]);
    return 0;
}

T4:

#include<cstdio>
using namespace std;
#define maxlongint 1999999999//事實證實,用-maxlongint的效果最好
int f[500001],queue[500001],x[500001],s[500001];
int main()
{
    freopen("jump.in","r",stdin);
    freopen("jump.out","w",stdout);
    int n,d,k,l=0,r=1000000000,mid,i,j,t,ans=-1,maxx,minn,head,tail,last;
    bool bk,bz;
    scanf("%d%d%d",&n,&d,&k);
    for(i=1;i<=n;i++) scanf("%d%d",&x[i],&s[i]);
    l=0;r=1000000000;
    while(l<=r)
    {
        mid=(l+r)/2;
        maxx=d+mid;bk=false;bz=true;
        minn=d-mid;last=0;
        if(minn<1) minn=1;
        tail=head=1;
        queue[1]=0;
        for(i=1;i<=n;i++)
        {
            if(maxx>=x[i]&&minn<=x[i])
            {
                bz=false;
                break;
            }
        }
        if(bz)
        {
            l=mid+1;
            continue;
        }
        for(i=1;i<=n;i++)
        {
            f[i]=maxlongint;
            for(j=last+1;j<i;j++)
            {
                if(x[j]+minn>x[i]) break;
                if(x[j]+maxx<x[i]) continue;
                last=j;
                if(f[j]==maxlongint) continue;
                while(head<=tail&&f[queue[tail]]<=f[j]) queue[tail--]=0;
                queue[++tail]=j;
            }
            while(head<tail&&x[queue[head]]+maxx<x[i]) head++;
            if(x[queue[head]]+maxx<x[i]||x[queue[head]]+minn>x[i]) f[i]=maxlongint;
            else f[i]=f[queue[head]]+s[i];
            if(f[i]<maxlongint&&f[i]>=k)
            {
                bk=true;
                break;
            }
        }
        if(bk)
        {
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    printf("%d\n",ans);
    return 0;
}
相關文章
相關標籤/搜索