腾讯 正式考-技术研发类-综合-2019校园招聘-2018.09.16

版权声明:本人ZZU在校学生,文章均为个人心得,有不足之处请不吝赐教! https://blog.csdn.net/whl_program/article/details/82731631

1-1.jpg
1-2.png
这道题有点难理解,是Topcoder SRM 661 (Div.1) 250 MissingLCM – 数论原题
点击查看题解

代码:

#include <bits/stdc++.h>

using namespace std;
int MAX(int a, int b){
    return a > b ? a : b;
}
vector<int> primes(int n){//得到小于n的质数数组
    vector<int> res;
    vector<bool> arr(n+1, false);
    for(int i = 2; i <= n; i++){
        if(!arr[i]){
            for (int j=2*i; j<=n; j+=i)
                arr[j] = true;
            res.push_back(i);
        }
    }
    return res;

}
int exponent(int a, int b){//求指数
    int res = 0;
    while(a%b == 0){
        a /= b;
        res++;
    }
    return res;
}
int getMin(int n){
    int res = 2;
    vector<int> arr = primes(n);
    for(int i=0; i<arr.size(); i++){
        int maxExponent = 0;
        int temp = arr[i];
        while(temp <= n) {
            maxExponent = MAX(maxExponent, exponent(temp, arr[i]));
            temp += arr[i];
        }
        while (exponent(temp, arr[i]) < maxExponent){
            temp += arr[i];
        }
        res = MAX(res, temp);
    }
    return res;
}
int main()
{
    int n;
    cin >> n;
    cout << getMin(n) << endl;
    return 0;
}

2-1.png
2-2.png
当时没做出来,只30%通过率,后来用队列加以改进,自己的测试样例没问题,只是没有提交
计算出度和入度主要是不仅需要计算紧紧相连的点,还需要计算间接相连的点
visit数组统计已经记录过得节点,防止自环陷入死循环

代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;
struct GraphNode{
     int label;
     vector<GraphNode *> neighbor;//节点能够直接到达的城市 直接出度
     vector<GraphNode *> gety;//能够直接到达该节点的城市 直接入度
     GraphNode(int x) : label(x) {};
};
//利用队列计算节点出度
int get_x(vector<GraphNode *> graph, int i, vector<int> visit){
     visit[i] = 1;
     int counts = 0;
     queue<GraphNode *> data;
     data.push(graph[i]);
     while(!data.empty()){
         GraphNode *p = data.front();
         data.pop();
         for(int j=0; j < p->neighbor.size(); j++){
             if(visit[p->neighbor[j]->label] == -1){
                 data.push(graph[p->neighbor[j]->label]);
                 visit[p->neighbor[j]->label] = 1;
                 counts++;
             }
         }
     }
    return counts;
}
//利用队列计算节点入度
int get_y(vector<GraphNode *> graph, int i, vector<int> visit){
     visit[i] = 1;
     int counts = 0;
     queue<GraphNode *> data;
     data.push(graph[i]);
     while(!data.empty()){
         GraphNode *p = data.front();
         data.pop();
         for(int j=0; j<p->gety.size(); j++){
             if(visit[p->gety[j]->label] == -1){
                 data.push(graph[p->gety[j]->label]);
                 visit[p->gety[j]->label] = 1;
                 counts++;
             }
         }
     }
     return counts;
}
int fun(vector<GraphNode *> graph, vector<int> visit){
     int result = 0;
     for(int i=0; i<graph.size(); i++){
         int x = get_x(graph,i,visit);//计算节点出度
         int y = get_y(graph,i,visit);//计算节点入度
         cout << x << " " << y << endl;
         if(x < y)
             result++;
     }
     return result;
}
int main()
{
    int n, m;
    vector<pair<int,int>> data;
    cin >> n >> m;
    for(int i=0; i<m; i++){
        int a, b;
        cin >> a >> b;
        data.push_back(make_pair(a, b));
    }
    vector<GraphNode *> graph;
    vector<int> visit;//记录已经遍历过的节点
    for(int i=0; i<n; i++){
        graph.push_back(new GraphNode(i));
        visit.push_back(-1);
    }
    for(int i=0; i<data.size(); i++){
        int begin = data[i].first;
        int end = data[i].second;
        graph[begin-1]->neighbor.push_back(graph[end-1]);
        graph[end-1]->gety.push_back(graph[begin-1]);
    }
    int res = fun(graph, visit);
    cout << res;
}

3-1.png
3-2.png
直接暴力了。。。

#include <bits/stdc++.h>

using namespace std;
int n;
bool foo(vector<int>& arr) {
    for(int i = 1; i < 80; ++i){
        if((arr[0]*i) % arr[1] != arr[2])
            continue;
        return true;
    }
    return false;
}

int main()
{
    cin >> n;
    vector<vector<int>> arr(n);
    int temp;
    for(int i=0; i<n; ++i){
        for(int j=0; j<3; ++j){
            cin >> temp;
            arr[i].push_back(temp);
        }
    }
    for(int i=0; i<n; ++i){
        if(foo(arr[i]))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/whl_program/article/details/82731631