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

 

posted @ 2017-06-26 10:10  Lawliet__zmz  阅读(109)  评论(0编辑  收藏  举报