NOIP2017普及组考后总结

题记(?)

记得春节刚过之时,曾祝愿金鸡的羽毛飞舞在2017的蓝天下;再算算,又过不了几天便又是新的一年。11月中旬,NOIP喧闹了秋日的金黄
———翻译:心态崩。

错因分析

在抒怀之前,先干一波正事。

(1)score

题目大意:给一个公式,对于 a,b,c score=20%a+30%b+50%c ,且保证 a,b,c 为整十数。

开始拿到为 double 一阵惊慌,一看整十数呵呵一笑,开写。

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);

第一题送分的,只要 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]<Min)
        {
            Min=books[j];
            flag=1;
        }
    if(!flag)
        printf("-1\n");
    else
        printf("%d\n",Min);
}

这道题,就是循环处理,找最大值,一般都没什么问题。

(3)chess

题目大意:给出一个矩阵,里面有3种颜色的格子(红、黄、白(白色不能直接走)),经过不同颜色格子的代价是不同的(如果两个格子的颜色相同,那你不需要花费金币;如果不同,则你需要花费1 个金币。以花费2 个金币施展魔法让下一个无色格子暂时变为你指定的颜色。也就是说,如果你使用了这个魔法,走到了这个暂时有颜色的格子上,你就不能继续使用魔法;只有当你离开这个位置,走到一个本来就有颜色的格子上的时候,你才能继续使用这个魔法,而当你离开了这个位置(施展魔法使得变为有颜色的格子)时,这个格子恢复为无色。)

这道题是我恐慌的开始,一看:深搜嘛…..一想,深搜嘛,我不会嘛,就跳过了….考完一看,好 easy

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

题目大意:给定一个数组 A[i] ,其中有几个位置可以踩,并得到相应的分(分值可能为负),每一次选择都可以从当前位置后的 g 个位置,可通过调整跳跃精度w,实现一段距离都可以跳,既可调到下 max(1,gw+1)g+w 个位置现在给出 gkA ,问 w 最小为多少可以使踩过的位置 sum>k

拿到,想都没想,暴力DP——本来是对的(30到40分),想多得点分,转移了位置——错了,5分,心态炸。

代码——呵,还没写出来。

学习总结<政治老师钟爱版>

1.before

以前的我如何学习编程的呢??每天中午抽一小段时间,在机房中浑浑噩噩的泡过一中午,能 AC 几道题自然开心,没 AC 也只以 Let it be 安慰自己罢了。周末上完课也回家把脑袋悬在《新思维》《金牌物理竞赛》上,睡完, NOIP 又是一届。

2.in the exam

思考较慢,平时能做的题也因为“贪心”丢了分。
对于并非擅长的题不敢尝试,实则很简单。

3.now

NOIP 的激励下,好好学习。

4.future

中午,尽量做题,实在不会看代码,过个几天背着打;上课,认真理解,确保至少做对基础题(最好还是把有难度的题做出来吧);周末回家,也一定在《新思维》中抽出时间,继续向前学习。

最后

祝我,迎头赶上;
再战,NOIP2018。

猜你喜欢

转载自blog.csdn.net/C20191904/article/details/78592014