zoukankan      html  css  js  c++  java
  • noip2016 小结(ac两题+学习总结)

    NOIP2016考试小结

    DAY 1

    T1    

    题目描述

    小南有一套可爱的玩具小人, 它们各有不同的职业。

    有一天, 这些玩具小人把小南的眼镜藏了起来。 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:

     

    这时singer告诉小南一个谜題: “眼镜藏在我左数第3个玩具小人的右数第1个玩具小人的左数第2个玩具小人那里。 ”

    小南发现, 这个谜题中玩具小人的朝向非常关键, 因为朝内和朝外的玩具小人的左右方向是相反的: 面朝圈内的玩具小人, 它的左边是顺时针方向, 右边是逆时针方向; 而面向圈外的玩具小人, 它的左边是逆时针方向, 右边是顺时针方向。

    小南一边艰难地辨认着玩具小人, 一边数着:

    singer朝内, 左数第3个是archer。

    archer朝外,右数第1个是thinker。

    thinker朝外, 左数第2个是writer。

    所以眼镜藏在writer这里!

    虽然成功找回了眼镜, 但小南并没有放心。 如果下次有更多的玩具小人藏他的眼镜, 或是谜題的长度更长, 他可能就无法找到眼镜了 。 所以小南希望你写程序帮他解决类似的谜題。 这样的谜題具体可以描述为:

    有 n个玩具小人围成一圈, 已知它们的职业和朝向。现在第1个玩具小人告诉小南一个包含 m条指令的谜題, 其中第 z条指令形如“左数/右数第 s,个玩具小人”。 你需要输出依次数完这些指令后,到达的玩具小人的职业。

    输入输出格式

    输入格式:

    输入的第一行包含西个正整数 n,m, 表示玩具小人的个数和指令的条数。

    接下来 n行, 每行包含一个整数和一个字符串, 以逆时针为顺序给出每个玩具小人的朝向和职业。其中0表示朝向圈内, 1表示朝向圈外。保证不会出现其他的数。字符串长度不超过10且仅由小写字母构成, 字符串不为空, 并且字符串两两不同。 整数和字符串之问用一个空格隔开。

    接下来 m行,其中第 z行包含两个整数 a,,s,,表示第 z条指令。若 a,= 0,表示向左数 s,个人;若a,= 1 ,表示向右数 s,个人。保证a,不会出现其他的数, 1≤ s,<n 。

    输出格式:

    输出一个字符串, 表示从第一个读入的小人开始, 依次数完 m条指令后到达的小人的职业。

    输入输出样例

    输入样例#1

    7 3

    0 singer

    0 reader

    0 mengbier

    1 thinker

    1 archer

    0 writer

    1 mogician

    0 3

    1 1

    0 2

    输出样例#1

    writer

    输入样例#2

    10 10

    1 C

    0 r

    0 P

    1 d

    1 e

    1 m

    1 t

    1 y

    1 u

    0 V

    1 7

    1 1

    1 4

    0 5

    0 3

    0 1

    1 6

    1 2

    0 8

    0 4

    /*话说noip出个水题容易吗!我还做错了,这么简单的题,考试的时候我在想啥来呀……完全不知道自己当时是啥状态。
    这个题,,,没啥思路*/
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #define maxn 100100
    
    using namespace std;
    int n,m,u,ans,t;
    int a[maxn],b[maxn],pos,tot;
    struct node{
        int u,w; string s;
    }e[maxn*2];
    
    int main()
    {
        cin>>n>>m;
        pos=1;
        for(int i=1;i<=n;i++)
        {
            cin>>e[i].u>>e[i].s;
            e[i].w=i;
        }
        for(int i=1;i<=m;i++)
        {
             cin>>a[i]>>b[i];
            if(a[i]==0)
            {
                    if(e[pos].u==0)
                    {
                        if(pos>b[i])
                          pos=pos-b[i];
                        else
                          pos=n-(b[i]-pos);
                    }
                    else
                    {
                        if(pos+b[i]<=n)
                          pos=pos+b[i];
                        else 
                          pos=pos+b[i]-n;
                    }
            }
            if(a[i]==1)
            {
                    if(e[pos].u==0)
                    {
                        if(pos+b[i]<=n)
                          pos=pos+b[i];
                        else 
                          pos=pos+b[i]-n;
                    }
                    else
                    {
                        if(pos>b[i])
                          pos=pos-b[i];
                        else
                          pos=n-(b[i]-pos);
                    }
            }
        }
        cout<<e[pos].s<<endl;
        return 0;
    }

    DAY 2

    T1

    题目描述

    组合数表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式:

     

    其中n! = 1 × 2 × · · · × n

    小葱想知道如果给定n,m和k,对于所有的0 <= i <= n,0 <= j <= min(i,m)有多少对 (i,j)满足是k的倍数。

    输入输出格式

    输入格式:

    第一行有两个整数t,k,其中t代表该测试点总共有多少组测试数据,k的意义见 【问题描述】。

    接下来t行每行两个整数n,m,其中n,m的意义见【问题描述】。

    输出格式:

    t行,每行一个整数代表答案。

    输入输出样例

    输入样例#1

    1 2

    3 3

    输出样例#1

    1

    输入样例#2

    2 5

    4 5

    6 7

    输出样例#2

    0

    7

    说明

    【样例1说明】

    在所有可能的情况中,只有是2的倍数。

    /*这个题在考场上的时候想了很久质因数分解,然后觉得跟暴力差不多分吧,最后还是打的暴力,结果被自己好坑……平时喜欢用的打表考试也敢没用2333 唉,真悲剧。
    思路:一道组合数的dp问题,f[i][j]表示Cij  mod  k,val[x]记录的是x这个数中有多少j(x>=j)满足Cxj mod k==0。可以得出递推式:若这个不选,则从f[i-1][j]转移过来。若选,就从f[i-1][j-1]转移过来。dp[i][j]表示Cij  mod  k==0的方案数。
    dp[i][j]中别忘了处理i==j的情况。*/
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    int n,k,t,m;
    int i,j;
    int f[2001][2001],dp[2001][2001],val[2001];
    
    int init()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    int main()
    {
        t=init();k=init();
        f[0][0]=1;
        for(i=1;i<=2001;i++)
        {
            f[i][0]=1;
            for(j=1;j<=2001;j++)
            {
                f[i][j]=(f[i-1][j]+f[i-1][j-1])%k;
                if(f[i][j]==0)val[i]++;
                dp[i][j]=dp[i-1][j]+val[i];
                if(i==j) dp[i][j]=dp[i-1][j-1]+val[i];
            }
        }
        while(t--)
        {
            n=init();m=init();
            m=min(n,m);
            printf("%d
    ",dp[n][m]);
        }
        return 0;
    }
    /*总结:
    从6月份开始正式开始学oi,到现在已经有半年了。说句实在话,我自认为我的效率是非常低的,因为学哥们在跟我学到相同时间的时候水平是比我高的(在第一次去日照的时候见识到了)。所以我对自己比较不满意。
    这次考试本来没怎么放在心上,就是去试试。但是通过这次考试暴露出来的一系列问题让我非常“恐慌”。
    首先我的得分我比较无语,才82分,学校里好像基本没有个第一题写挂的。对于这一点我发现了自己存在的两个问题:第一是基础不牢,平时的关注点总是在一些高级算法和数据结构上,所以代码实现能力很弱。第二是因为考场上思维打不开,总是主观臆断,考虑不全。考完试后第一题我读了10分钟就找出了错误,这就很尴尬了……
    另外就是我平常的一些学习习惯,缺乏自主的思考和纠错,总是依赖学长,让自己的思维和能力提不上去。
    还有最重要的一点是在这一段时间里,说实话,我缺乏对oi的兴趣和热情,让我学下去的动力只不过是满满的功利性。
    但是现在,我逐渐的发现了oi的有趣的一面,开始喜欢它了,我找到了我的问题所在,相信以后我会更加努力,学到更多东西的。*/
    

      

     

     

     
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    servlet类中ServletConfig及ServletContext
    jsp及servlet中获取项目路径的一些方法
    EL表达式的一些知识
    python——字符太长,换行需要三个引号。
    python——转义字符
    python——函数缺省参数的使用
    python——字典
    python——if、elif、else的使用
    python——对列表使用的函数方法
    python-创建数字列表
  • 原文地址:https://www.cnblogs.com/L-Memory/p/6131238.html
Copyright © 2011-2022 走看看