zoukankan      html  css  js  c++  java
  • 2017年校招全国统一模拟笔试(第三场)编程题集合

    牛客上的题和蓝桥暴力杯的差不多吧。。。。模拟,要考虑各种情况

    1.

    20亿大小,int都没超附上速查表,int 21亿多

    傻逼了,还用字符串

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int main()
    {
    //    freopen("in.txt","r",stdin);
        char str[15];
    
        while(~scanf("%s",str))
        {
    
            int sum = 1;
            int cnt = 0;
            int len = strlen(str);
            if(len==1) {
                cout<<0<<endl;
                return 0;
            }
    
            for(int i = 0; i < len; i++)
            {
                int t = str[i]-'0';
                sum*=t;
            }
    
            cnt++ ;
            int tmp = 1;
            int flag = 0;
            while(sum>10) {
                    tmp = 1;
                while(sum>0) {
                    int t = sum%10;
                    tmp *= t;
                    sum /= 10;
                    }
                    sum = tmp;
                    cnt++;
                }
                cout<<cnt<<endl;
            }
        return 0;
    }
    View Code

    2.

    一开始质数的范围判断有问题,应该到sqrt(n),包括这个数,下面判断就在+1的位置了

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    bool IsPrime(int n){
        int i;
        int dd = sqrt(n*1.0);
        for(i = 2; i <= dd; i++){
            if(n%i==0)
                break;
        }
        if(i==dd+1)
            return true;
        else
            return false;
        }
    int d[20];
    int main()
    {
    //    freopen("in.txt","r",stdin);
        int a,b;
        while(~scanf("%d%d",&a,&b)) {
                int sum = 0;
            for(int k = a; k <=b; k++){
                int num = 0;
                int tt = k;
                while(tt>0) {
                    int t = tt%10;
                    if(t!=0) {
                        d[num++] = t;
                    }
                    tt /= 10;
                }
    
                int flag = 0;
                int tmp;
                for(int i = 0; i < num; i++) {
                        if(flag) break;
                    for(int j = 0; j < num; j++) {
                            if(i==j) continue;
                        tmp = d[i]*10+d[j];
                        if(IsPrime(tmp)) {
                            sum++;
                            flag = 1;
                            break;
                        }
                    }
                }
            }
            cout<<sum<<endl;
        }
    }
    View Code

    3.

    思路就是找出当前匹配串的重合最大值,然后其他长度差值都可以满足重合。记得一维的循环是在不超过原串的长度匹配,dif是差值+1的。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    
    int main() {
    //    freopen("in.txt","r",stdin);
        char str[55];
        char sub[55];
        while(~scanf("%s%s",sub,str)) {
            int Max = 0;
    
            int len = strlen(str);
            int d = strlen(sub);
            int dif = len - d + 1;
            for(int i = 0; i < dif; i++) {
                int cur = i;
                int cnt = 0;
                for(int j = 0; j < d; j++) {
                    if(sub[j]==str[cur]) {
                        cnt++;
                    }
                cur++;
                }
                Max = max(Max,cnt);
            }
            int ans = len-(len-d+Max);
            cout<<ans<<endl;
        }
        }
    View Code

    4.

    思路:排序后大数除小数,商必须要是2的倍数,或者为1才行,注意在IsTrue必须要有一个返回值在判断条件外面。否则牛客的OJ会报错

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    int a[55];
    bool Istrue(int n)
    {
        if(n==1)
            return true;
        while(n>0)
        {
            if(n%2==0)
            {
                n/=2;
                if(n==1) {
                    return true;
                }
            }else {
                return false;
            }
        }
        return false;
    }
    
    int main()
    {
    //    freopen("in.txt","r",stdin);
        int n;
        while(~scanf("%d",&n))
        {
    
            for(int i = 0; i < n; i++)
            {
                cin>>a[i];
            }
            sort(a,a+n);
            int flag = 0;
            for(int i = 0; i < n; i++)
            {
                if(flag) break;
                for(int j = i+1; j < n; j++)
                {
                    int t = a[j]/a[i];
                    double t2 = a[j]*1.0/a[i]*1.0;
                    if(t2-t>0) {
                        flag = 1;
                        break;
                    }
                    if(Istrue(t)) continue;
                    else
                    {
                        flag = 1;
                        break;
                    }
                }
            }
            cout<<(flag?"NO":"YES")<<endl;
    
        }
        return 0;
    }
    View Code

    5.

     

    刚开始的思路是找出凸包和凹包,即找出分界点,最后ans++,后来提交还是有问题。比如1212121,132435,像这样的相邻的序列如果是同种顺序的排列,上一个序列的结束点和新序列的开始点都会是一个分割点。所以还是要用几个标记来严格特殊评判下。

    新思路就是要声明三个标记,每段的序列的开始flag=0,序列的开始ans不自加,这就解决了上面的问题。然后比较序列的第二个,递增则标记1,递减则2,后面相等的和同顺序的就不用管,直到找到在1的情况的递减和2的情况的递减,然后把这个数置为新序列的开始点,flag=0。

    注意相等根据题意就不要管了,不能改变标记的状态。

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    int a[100000+10];
    int main()
    {
    //    freopen("in.txt","r",stdin);
        int n;
        while(~scanf("%d",&n))
        {
            int ans = 0;
            for(int i = 0; i < n; i++)
            {
                cin>>a[i];
            }
            int flag = 0;
            int pre =  a[0];
            for(int i = 1; i < n; i++)
            {
                int cur = a[i];
                //一段序列的开始
                if(flag==0)
                {
                    //递增序列
                    if(cur>pre)
                    {
                        flag = 1;
                    }
                    //递减序列
                    else if(cur < pre)
                    {
                        flag = 2;
                    }
                }
    
                else if(flag==1)
                {
                    if(cur<pre)
                    {
                        ans++;
                        flag = 0;//这段序列结束了
                    }
                }
                else if(flag==2)
                {
                    if(cur>pre)
                    {
                        ans++;
                        flag = 0;
                    }
                }
                pre = cur;
            }
            cout<<++ans<<endl;
        }
        return 0;
    }
    View Code

    6.

    位置就是排序后,第一个人和倒着的两个人组队,依次这样,其实中间这个人的位置就在这个排序后的序列有位置了

    #include <iostream>
    #include <cstring>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn = 100000+10;
    int a[maxn*3+10];
    
    
    int main() {
        int n;
    //    freopen("in.txt","r",stdin);
        while(cin>>n) {
            int len = 3*n;
            for(int i = 0; i < len; i++) {
                cin>>a[i];
            }
            sort(a,a+len);
            ll sum = 0;
    
            for(int i = 1; i <= n; i++) {
    
                int pos = len-i*2;
                sum += a[pos];
            }
            cout<<sum<<endl;
        }
    }
    View Code
  • 相关阅读:
    浅谈通信网络(五)——TCP层
    浅谈通信网络(四)——报文转发(IP/MAC)
    浅谈通信网络(三)——TCP/IP协议
    《linux内核设计与实现》阅读笔记-进程与调度
    深入理解计算机系统 BombLab 实验报告
    汇编语言十二
    汇编语言十一
    汇编语言实验十
    汇编语言实验九
    汇编语言实验七
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256581.html
Copyright © 2011-2022 走看看