zoukankan      html  css  js  c++  java
  • 一次愚蠢的NOIP模拟赛

    找礼物[find.pas/find.c/find.cpp]

    【问题描述】

           新年到了,突然间,就在那美丽的一霎那,你好友和你(K个人)的周围满是礼物,你发扬你帅气的风格,让你的好友先拿,但是每个人只能拿当前离自己最近的礼物[当然如果有并列的多个礼物离你的距离相等(精确到小数后四位,所有运算均为去尾),这些礼物就都属于这个人]。现在你们所在的位置是原点(0,0),每个礼物的位置用坐标表示。现在告诉你每个礼物的坐标,还有每个礼物是谁送的。要你找出你的礼物离你多远,你能拿到多少礼物,这些礼物是谁送的。如果你拿不到礼物,请输出“555…”

    【输入】

    第一行:N 和 K 分别表示礼物的个数和人数。

    第二到N+1行:每行先是赠送礼品人的姓名,然后是礼物的坐标(x,y)。

    数据间空格分割

    【输出】

    第一行: D 和 U 表示礼物距你多远(只要去尾后的整数)和你能拿到多少礼物。

    第二到U+1行:每行一个人名,表示送礼的人。<按照输入的顺序输出>

    【输入输出样例】

    样例1:

    输入(find.in):

    5 2

    Jason 1 1

    Herry 4 4

    Patty 3 4

    Tom 2 10

    Petter 5 10

    输出(find.out):

    5 1

    Patty

    样例2:

    输入(find.in):

    6 2

    Jim 1 –1

    Flord 3 –3

    Joseph –1 1

    Steve 3 3

    Tiger 2 –10

    User 10 20

    输出(find.out):

    4 2

    Flord

    Steve

    样例二说明:jim 和 joseph 的礼品是等距的距离最短,被第一个人拿走,剩下的四个人中flord和steve的礼物也是等距的计算得到距离为4。

    【数据范围】

    对于30%的数据 K≤N≤1000

    对于所有的数据 K≤N≤100000

    所有的坐标绝对值小于106         

    Solution

    傻逼题,计算所有的dis,随便排个序,然后扫描一遍,输出答案

    Code

    No Code
    没有


     打包[pack.pas/pack.c/pack.cpp]

    【问题描述】

    你现在拿到了许多的礼物,你要把这些礼物放进袋子里。你只有一个最多装下V 体积物品的袋子,你不能全部放进去。你也拿不动那么重的东西。你估计你能拿的最大重量为 G。现在你了解了每一个物品的完美值、重量和体积,你当然想让袋子中装的物品的完美值总和最大,你又得计划一下了。

    【输入】

    第一行:V 和 G 表示最大重量和体积。

    第二行:N 表示拿到 N 件礼物。

    第三到N+2行:每行3个数 Ti Vi Gi 表示各礼物的完美值、重量和体积

    【输出】

    输出共一个数,表示可能获得的最大完美值。

    【输入输出样例】

    输入(pack.in):

    6 5

    4

    10 2 2

    20 3 2

    40 4 3

    30 3 3

    输出(pack.out):

    50

    【数据范围】

    对于20%的数据 N,V,G,Ti,Vi,Gi≤10

    对于50%的数据 N,V,G,Ti,Vi,Gi≤100

    对于80%的数据 N,V,G,Ti,Vi,Gi≤300

    80%到100%的数据是N,V,G,Ti,Vi,Gi≤380 的离散随机数据。

    Solution

    傻逼题,简直就是01背包,随便多个限制随便搞搞就出来了

    Code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int V,G,N,t[400],v[400],g[400],f[400][400],ans;
    int main()
    {
        scanf("%d%d%d",&V,&G,&N);
        for (int i=1;i<=N;i++) scanf("%d%d%d",&t[i],&v[i],&g[i]);
        memset(f,128,sizeof(f));
        f[0][0]=0;
        for (int i=1; i<=N; i++)
            for (int j=V; j>=v[i]; j--)
                for (int k=G; k>=g[i]; k--)
                      f[j][k]=max(f[j][k],f[j-v[i]][k-g[i]]+t[i]);
        for (int i=0;i<=V;i++)
            for (int j=0;j<=G;j++)
                ans=max(ans,f[i][j]);
        printf("%d
    ",ans);
        return 0;
    }
    感觉这么傻逼,完全不想放


    Mason数(Mason.pas)

    【问题描述】形如2P-1的素数称为Mason数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个Mason数。最大的一个是P=3021377,它有909526位。Mason数有许多重要应用,它与完全数密切相关。

    任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)

    【输入格式】

    文件中只包含一个整数P(1000<P<3100000)

    【输出格式】

    第一行:十进制高精度数2P-1的位数。

    2-11行:十进制高精度数2P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)

    不必验证2P-1与P是否为素数。

    【输入样例】

    1279

    【输出样例】

    386

    00000000000000000000000000000000000000000000000000

    00000000000000000000000000000000000000000000000000

    00000000000000104079321946643990819252403273640855

    38615262247266704805319112350403608059673360298012

    23944173232418484242161395428100779138356624832346

    49081399066056773207629241295093892203457731833496

    61583550472959420547689811211693677147548478866962

    50138443826029173234888531116082853841658502825560

    46662248318909188018470682222031405210266984354887

    32958028878050869736186900714720710555703168729087

    Solution

    一脸普及组难度,没错,就是原题!!!

    快速幂+高精乘随便A,时间复杂度$O(500^{2}logP)$

    ORZ   DCrusher大爷写分治高精乘

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    void Freopen() {freopen("mason.in","r",stdin); freopen("mason.out","w",stdout);}
    void Fclose() {fclose(stdin); fclose(stdout);}
    int P;
    struct big{int a[1010]; big() {memset(a,0,sizeof(a));}};
    big mul(big a,big b)
    {
        big c;
        for (int i=1; i<=500; i++)
            for (int j=1; j<=500; j++)
                c.a[i+j-1]+=a.a[i]*b.a[j];
        for (int i=1; i<=500; i++)
            c.a[i+1]+=(c.a[i]/10),c.a[i]%=10;
        return c;
    }
    big Pow(big x,int y)
    {
        big re; re.a[1]=1;
        for (int i=y; i; i>>=1,x=mul(x,x))
            if (i&1) re=mul(re,x);
        return re;
    }
    int main()
    {
        Freopen();
        scanf("%d",&P);
        int len=(log(2)/log(10)*P)+1;
        printf("%d
    ",len);
        big now; now.a[1]=2;
        big ans=Pow(now,P);
        ans.a[1]--;
        int cnt=0;
        for (int i=500; i>=1; i--)
            {
                printf("%d",ans.a[i]); cnt++;
                if (cnt%50==0) puts("");
            }
        Fclose();
        return 0;
    }
    愚蠢的代码


    解密 (Cryptcowgraphy)

        农民Brown和John的牛们计划协同逃出它们各自的农场。它们设计了一种加密方法用来保护它们的通讯不被他人知道。

        如果一头牛有信息要加密,比如"International Olympiad in Informatics",它会随机地把C,O,W三个字母插到到信息中(其中C在O前面,O在W前面),然后它把C与O之间的文字和 O与W之间的文字的位置换过来。这里是两个例子:

                International Olympiad in Informatics
                                  -> 
                CnOIWternational Olympiad in Informatics
                
                International Olympiad in Informatics
                                  -> 
                International Cin InformaticsOOlympiad W

        为了使解密更复杂,牛们会在一条消息里多次采用这个加密方法(把上次加密的结果再进行加密)。一天夜里,John的牛们收到了一条经过多次加密的信息。请你写一个程序判断它是不是这条信息经过加密(或没有加密)而得到的:

                Begin the Escape execution at the Break of Dawn

    程序名字: cryptcow

    输入格式

        一行,不超过75个字符的加密过的信息。

    范例输入(文件cryptcow.in)

    Begin the EscCution at the BreOape execWak of Dawn

    输出格式

        一行,两个整数. 如果能解密成上面那条逃跑的信息,第一个整数应当为1,否则为0;如果第一个数为1,则第二个数表示此信息被加密的次数,否则第二个数为0。

    范例输出(文件cryptcow.out)

    1 1

    Solution

    纯暴搜

    说一下减枝

    首先cn==wn==on。  用Hash去判调冗余状态。 被COW卡住的是原串中的最小单位,所以判断这个部分是否出现,就可以判断这个状态是否合法

    正解是bfs...反正dfs+剪枝也能过

    顺带说一句,直接输出0 0有40,直接输出1 cn有60

    Code

    No Code
    没有


    启发:

    首先精度要注意好,理解去尾的特殊性,不同于平常的判断

    排序结构体时,结构体里不要有数组,因为交换时并不是交换指针而是一个一个交换,效率非常慢!!

    搜索要多加减枝,要多考虑特殊的答案,尽可能多得分

    那种辛苦爆搜就因为少一个减枝,被直接输出的裸骗分碾的感觉真TMD不爽!!!!

  • 相关阅读:
    仿造email后缀自动添加功能(1)
    仿造email后缀搜索功能(2)
    取出input内的空格
    小知识点
    关于闭包
    js清除浏览器缓存的几种方法
    动态生成模板(模板生成器)
    安卓端调用h5界面js方法和ios端调用h5界面js方法
    linux 命令
    如何做个好员工
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5792740.html
Copyright © 2011-2022 走看看