腾讯2019校招研发卷

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jirryzhang/article/details/82722274

第一题

给出n,求最小的正整数m 使得LCM(1...n)==LCM(n+1...m)

/**
 * 给出n  求最小的正整数m 使得LCM(1...n)==LCM(n+1...m)
 * 推结论的题 直接是求小于等于n的素数次方数*2
 */
#include <iostream>
using namespace std;
const int MAXN = 1e6+5;
long long p[MAXN];
bool prime[MAXN];
int k;
void init()
{
    k = 0;
    memset(prime, 0, sizeof(prime));
    prime[0] = prime[1] = 1;
    for(auto i=2; i<MAXN; i++)
    {
        if(!prime[i])
        {
            p[k++] = i;
            for(long long j=i*i; j<MAXN; j+=i)
                prime[j] = 1;
        }
    }
}
int main()
{
    init();
    int n;
    while(cin>>n)
    {

        int res = 2;
        for(auto i=2; i<=n; i++)
        {
            if(!prime[i])
            {
                int sum = i;
                while(sum <= n/i)
                    sum *= i;
                res = max(res, (n/sum+1)*sum);
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

第二题

单向有环图,求满足要求的点(该点可达顶点数<可达该点的顶点数)的个数。用图的深度遍历可解。

考试的时候地点没选好,吵吵闹闹的,心态爆炸,竟然把标记已访问节点的数组给去掉了,遇到有环的case就把栈给爆了。

#include<iostream>
#include <vector>
#include <unordered_set>
using namespace std;
void Dfs(const vector<unordered_set<int>>& path,vector<int>& visited,unordered_set<int> & canVisit,int cur)
{
    for(auto i=path[cur].begin();i!=path[cur].end();++i)
    {
        if(visited[*i]==0) {
            visited[*i]=1;
            canVisit.insert(*i);
            Dfs(path, visited, canVisit, *i);
        }
    }
    return ;
}
int main()
{
    int n,m,u,v;
    while(cin>>n>>m) {
        vector<unordered_set<int>> path(n);
        vector<unordered_set<int>> canVisit(n);
        for(auto i=0;i<m;++i){
            cin>>u>>v;
            u-=1;
            v-=1;
            path[u].insert(v);
        }
        vector<int> beVisted(n,0);
        for(auto i=0;i<n;++i){
            vector<int> visited(n,0);
            Dfs(path,visited,canVisit[i],i);
        }
        for(auto i=0;i<n;++i){
            for(auto j:canVisit[i]){
                ++beVisted[j];
            }

        }
        int cnt=0;
        for(auto i=0;i<n;++i){
            if(beVisted[i]>canVisit[i].size())
                cnt++;
        }
        cout<<cnt<<endl;
    }
}

第三题

输入三个数A、B、C。输出是否存在A的倍数d满足d%B==C。存在输出"YES",不存在输出"NO"。

把这道题目想复杂了,觉得case肯定会有很大的数(没有认真审题),所以没有用暴力枚举做,放弃了这道题。下面是暴力枚举的解法。

#include <iostream>
using namespace std; 
int main() {
    int n; 
    int a, b, c; 
    while(cin >> n){ 
        for(auto i=0;i<n;++i) {
            cin >> a >> b >> c; 
            int m = a - b; 
            bool r=false; 
            for(int x = 0; x < 1000; x++) {
                for(int y = -1000; y < 1000; y++) {
                    if(x * m + y * a == c) { 
                        r = true; 
                        break; 
                    }  
                } 
            }
            cout << (r ? "YES" : "NO") << endl; 
        }
    }
    return 0;  
}

另一种解法如下:

/**
 * gcd求最大公约数,可用C++17的库函数
 */
#include<iostream>
#include <numeric>
using namespace std;
int main(){
    int n;
    int a,b,c;
    while(cin>>n){
        for(auto i=0;i<n;++i){
            while(cin>>a>>b>>c){
                if (c%gcd(a,b)==0)
                    cout<<"YES"<<endl;
                else
                    cout<<"NO"<<endl;
            }
        }    
    }
    return 0;
}

题目都比较基础,为了省事在二餐西餐厅考的(一直听说二餐西餐厅是个阅读思考的好地方,结果被现实狠狠扇了一巴掌),结果到了11点好多人来吃饭,熙熙攘攘,又加上对第三题审题失误,觉得没法用暴力枚举解决大CASE的情况,心态爆炸,本来能AC的题都没AC。感觉跟心心念的鹅厂无缘了,凉凉...

猜你喜欢

转载自blog.csdn.net/jirryzhang/article/details/82722274