zoukankan      html  css  js  c++  java
  • 2/14 考试 笔记

    今天三个题的考试。


    题解(不会的T3)原作:

    https://blog.csdn.net/Ab_Ever/article/details/77185812

    先说会的T1:

    T1实际上是一个水题

    主要思路是要进行查找

    于是就有了暴力的搜索方式:枚举

    没有优化,不知道可否过。

    上题目:

    小J的五子棋

      小J非常热爱玩游戏,尤其喜欢五子棋。
      五子棋是一款这样的游戏:
      在一个N*N的网格上,玩家依次在格子上放下棋子,如果棋子在同一横排、同一竖排、同一斜线(有两条不同的斜线,从左上到右下以及从右上到左下)连续出现了五个,那么就满足了胜利条件。需要注意的是,与一般的五子棋不同,我们只考虑一个玩家的棋子,即不存在不同的颜色。
      小J于是开始了一盘紧张刺激的五子棋。
      小J的玩法和一般的玩法不同,小J喜欢先写下一个长度为M的放置棋子序列,然后依次放置棋子,直到满足胜利条件为止,或者说序列上的棋子都放置完了。
      那么,小J想知道会在放置第几个棋子之后达到胜利条件。
     
    输入格式:
      第一行两个正整数N,M,意义见题面。
      接下来M行,每行两个整数x,y.(x,y)表示放置的棋子的坐标。保证1<=x,y<=N.
     
    输出格式:
      一行一个整数,表示达到胜利条件时放置的棋子。如果达不到胜利条件,输出-1.
     
      输入样例:
        5 5
        1 1
        2 2
        3 3
        4 4
        5 5
      输出样例:
        5
      数据规模:
        对于30%的数据,1<=N,M<=10.
        对于60%的数据,1<=N,M<=100.
        对于100%的数据,1<=N<=20000,M<=200000.

    数据范围真小哈哈哈哈
    我们边输入边判断:
    这样先输出的一定是最先放置的最优解。
    判断什么呢?先横着枚举x轴,直到遇到没有棋子的棋盘格子,记下连号cnt值(左右各一遍),
    然后再y轴,两条对角线,各种枚举,最后发现都没有连起来>=5的,就返回false就是了。
    上代码:
    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <bitset>
    
    using namespace std;
    bitset<400040001>mp;//存棋盘
    int n,m;
    
    bool judge(int x,int y)
    {
        int cnt=0;//棋子计数器
        //跑y轴
        for (register int i=y;i>0;i--)
        {
            if (mp[(x-1)*n+i]==1)cnt++;
            else break;
        }
        for (register int i=y+1;i<=n;i++)
        {
            if (mp[(x-1)*n+i]==1)cnt++;
            else break;
        }
        if (cnt>=5)return true;
        //跑x轴
        cnt=0;
        for (register int i=x;i>0;i--)
        {
            if (mp[(i-1)*n+y]==1)cnt++;
            else break;
        }
        for (register int i=x+1;i<=n;i++)
        {
            if (mp[(i-1)*n+y]==1)cnt++;
            else break;
        }
        if (cnt>=5)return true;
        //跑斜线
        cnt=0;
        for (register int i=x,j=y;i>0&&j>0;i--,j--)
        {
            if (mp[(i-1)*n+j]==1)cnt++;
            else break;
        }
        for (register int i=x+1,j=x+1;i<=n&&j<=n;i++,j++)
        {
            if (mp[(i-1)*n+j]==1)cnt++;
            else break;
        }
        if (cnt>=5)return true;
        //另外一条
        cnt=0;
        for (register int i=x,j=y;i>0&&j<=n;i--,j++)
        {
            if (mp[(i-1)*n+j]==1)cnt++;
            else break;
        }
        for (register int i=x+1,j=y-1;i<=n&&j>0;i++,j--)
        {
            if (mp[(i-1)*n+j]==1)cnt++;
            else break;
        }
        if (cnt>=5)return true;
        return false;
    }
    
    int main()
    {
        ifstream fin("A.in");
        ofstream fout("A.out");
        fin>>n>>m;
        //cin>>n>>m;
        int x,y;
        for (register int i=1;i<=m;i++)
        {
            fin>>x>>y;
            //cin>>x>>y;
            mp[(x-1)*n+y]=1;
            if (judge(x,y))
            {
                fout<<i;//若ok,就输出然后就停了
                //cout<<i;
                return 0;
            }
        }
        fout<<"-1";//都不ok就输出-1
        //cout<<"-1";
        return 0;
    }

    另外,因为内存限制原因,我们不要开map,也不要开bool,bitset水过去就好了。

    (STL真香)


    T2
    小J爱gcd
    最大公约数,greatest common divisor,简称gcd。
    对于非负整数x与y的最大公约数,为最大的正整数z,使得x与y均是z的整数倍。特定地,gcd(0,0)=0,gcd(0,x)=x.
    小J非常清楚一点:gcd是数学王国的统治者,一切函数都要臣服于gcd之下,哪怕是增长速度极快的指数函数也不例外。
    小J非常想知道当统治者gcd与速度之王结合在一起会是怎么样的效果,于是小J想出了这么一个题目:求解gcd(a^b,c^d).
    小J于是将问题交给了你。为了运算方便,将最后的结果对1e9+7取模后输出。
     
    输入格式:
    一行四个非负整数a,b,c,d。意义见体面。
     
    输出格式:
    一行一个整数,为所求的答案。
     
    输入样例:
    2 3 4 1
     
    输出样例:
    4
     
    样例解释:
     
     
    数据规模:
    对于30%的数据,a,b,c,d<=10.
    对于60%的数据,a,b,c,d<=10000.
    对于100%的数据,a,b,c,d<=10^9.
    行吧,这个题我用的是快速幂+GCD然后%%%
    快速幂不多说,关键是gcd的时候要返回什么值,
    外加一堆特判,水过去算了。(应该不是满分解)
    上代码:
    #include <iostream>
    #include <fstream>
    #include <cstdio>
    
    using namespace std;
    typedef long long int lli;
    inline lli quick_pow(lli a, lli b, lli c)
    {
        if (a==0)return 0;
        if (a==1)return 1;
        if (b==0)return 0;
        lli res = 1;
        a %= c;
        while (b)
        {
            if (b & 1)
                res = (res * a) % c;
            a = (a * a) % c;
            b >>= 1;
        }
        return res;
    }
    inline lli gcd(lli a,lli b)
    {
        if (a==0&&b==0)return 0;
        else if (a!=0&&b==0)return b;
        else if (a==0&&b!=0)return a;
        else
        {
            while (a%b!=0)
            {
                lli temp=a;
                a=b;
                b=temp%b;
            }
            return b;
        }
    }
    lli min(lli a,lli b)
    {
        return a<=b?a:b;
    }
    int main()
    {
        ofstream fout("B.out");
        ifstream fin("B.in");
        lli a,b,c,d,degcd,ans;
        /*fin*/fin>>a>>b>>c>>d;
        //degcd=gcd(a,c);
        //ans=quick_pow(degcd,min(b,d),1e9+7);
        ans=gcd(quick_pow(a,b,1e9+7),quick_pow(c,d,1e9+7));
        /*fout*/fout<<ans;
        return 0;
    }

    T3不会,看上面的博客吧。

    End.

  • 相关阅读:
    完美解决CTRL+空格不能切换中/英文输入法的问题
    【Delphi内联汇编学习1】Delphi与汇编
    替换bmp图片中的颜色 good
    将四个BYTE数值转换成IEEE754标准的浮点数(两种方法:用Addr函数取字节数字的首地址,或者用Absolute关键字)
    在delphi的exe文件中嵌入另外一个exe文件
    Qt中的串口编程之三
    使用MIDAS访问远程Access数据库
    QSqlDatabase的进一步封装(多线程支持+更加简单的操作)——同时支持MySQL, SQL Server和Sqlite
    Qt for Linux:环境搭建(CentOS 6.5 32位)——完全从零安装
    Qt for Windows:使用WinPcap开发高性能UDP服务器
  • 原文地址:https://www.cnblogs.com/jelly123/p/10373750.html
Copyright © 2011-2022 走看看