zoukankan      html  css  js  c++  java
  • 牛客小白月赛31题解(5/10)

    牛客小白月赛31部分题解(5/10)

    A.A|B

    A.A|B

    待补。。。

    B.A+B

    B.A+B
    大模拟,难得写。。。

    C.图像存储

    C.图像存储
    待补。。。

    1、BFS搜索连通分量

    2、变换坐标

    3、去重

    D.坐标计数

    D.坐标计数

    题意为统计一个区域内满足条件的点的个数,通过打表可以看出每个点都满足条件,所以只需要输出区域内所有点的个数即可(推了半天,打个表发现天呐。。。

    代码:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        int t;
        cin >> t;
        
        while(t--)
        {
            long long x1, y1, x2, y2;
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            
            cout << (x2 - x1 + 1) * (y2 - y1 + 1) << endl;
        }
        return 0;
    }
    

    E.解方程

    E.解方程

    待补。。。

    F.消减整数

    F.消减整数

    分析:设n减到x时不够减

    第一次:n减到x时不够减,剩余t,则t < x

    第二次:n+t减到x时不够减, 剩余2t-x, 则2t-x<x

    第i次:n+it减到x时不够减,剩余it-(i-1)x,则it-(i-1)x<x

    由此可得,当且仅当最后(i*t)x的倍数时,能够减完x,并n减到0

    代码:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        int t;
        cin >> t;
        
        while(t--)
        {
            int i, n, x = 0;
            cin >> n;
            while(n >= x) n -= x, x++;
            for(i = 1; ; i++)
                if(i*n % x == 0)
                    break;
            cout << i << endl;
        }
        return 0;
    }
    

    G.简单题的逆袭

    G.简单题的逆袭

    题意:给定x,y,找出满足方程 $x^k le y $的最大的k

    分情况讨论:

    1、当x或者y等于0,或者x=1的时候,无论k多大,都不可能大于y,所以k不存在,输出-1;

    2、当x>yy!=0的时候,很明显,只有当k = 0的时候,才能满足题意,输出0;

    3、当x == y的时候,只有当k = 1时,才能满足题意,输出1;

    4、前面条件都不满足的一般情况,由于x和y的数据范围非常大,可能会爆,转而可以想出:假设k已经最大了,移项可得:(1 leq y / x^k),问题转化为求最大的k+1使得(1/k leq y / x^{k+1}),由于k为正整数(int除法中1/k == 0),问题进一步转化为y除以多少个x等于0,答案即为个数减1;

    代码:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int t;
    long long x, y;
    
    int main()
    {
        cin >> t;
        
        while(t--)
        {
            cin >> x >> y;
            if(!x || !y || x == 1) cout << -1 << endl;
            else if(x > y) cout << 0 << endl;
            else if(x == y) cout << 1 << endl;
            else
            {
                int i;
                for(i = 0; y; i++) y = y / x;
                cout << i - 1 << endl;
            }
        }
        return 0;
    }
    

    H.对称之美

    H.对称之美

    我们可以预处理除每个字符串的字母a~z的个数,然后比较对称位置字符串的字符组成,如果有相同的字符个数都不为0则循环继续,若循环正常结束,说明存在,输出“Yes”, 否则说明不存在,退出循环输出“No”。

    代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    int t, n;
    int a[30], b[30];
    char s[110][55];
    
    int main()
    {
        cin >> t;
        
        while(t--)
        {
            cin >> n;
            for(int i = 0; i < n; i++) scanf("%s", s[i]);
            
            bool flag = true;
            for(int i = 0, j = n-1; i < j; i++, j--)
            {
                memset(a, 0, sizeof a);
                memset(b, 0, sizeof b);
                for(int k = 0; k < strlen(s[i]); k++) a[s[i][k] - 'a']++;
                for(int k = 0; k < strlen(s[j]); k++) b[s[j][k] - 'a']++;
                int c;
                for(c = 0; c < 26; c++) if(a[c] && b[c]) break;
                if(c == 26)
                {
                    flag = false;
                    break;
                }
            }
            if(flag) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
        return 0;
    }
    

    I.非对称之美

    I.非对称之美

    对输入字符串进行对称检查,如果初始都不对称,那个最长非回文子串就是其自己,输出长度

    当整个字符串是回文串的时候,去掉最后一个字符,检查长度为len-1的子串的对称性,此时有两种个情况:

    1、不是是回文串,输出len-1即可

    2、是回文串,自己通过简单模拟推一下可以发现,如果该len-1的子串也是回文的,那个这个字符串的所有字符都相同,不存在非回文子串,输出0。

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string s;
        cin >> s;
        
        bool flag1 = true, flag2 = true;
        for(int i = 0, j = s.length() - 1; i <= j; i++, j--)
            if(s[i] != s[j])
            {
                flag1 = false;
                break;
            }
        for(int i = 0, j = s.length() - 2; i <= j; i++, j--)
            if(s[i] != s[j])
            {
                flag2 = false;
                break;
            }
        
        if(!flag1) cout << s.length() << endl;
        else if(!flag2) cout << s.length() - 1 << endl;
        else cout << 0 << endl;
        
        return 0;
    }
    

    J.排列算式

    J.排列算式

    待补。。。

  • 相关阅读:
    Linux的ftp和www的服务器在虚拟机上的搭建
    Android中ViewPager
    Vue学习中踩的坑
    MySQL性能优化
    从Java内存模型讲双重检查锁原理
    JAVA8新特性学习
    JAVA中使用openoffice将Excel转PDF再转图片功能实现
    netty自定义协议上传
    poi-tl生成Word
    gitlab搭建
  • 原文地址:https://www.cnblogs.com/grain-rain/p/14294870.html
Copyright © 2011-2022 走看看