小红书笔试20220828

第一题:用排序就行了

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    // 输出数据处理
    int n, m, id;
    cin >> n >> m >> id;
    vector<vector<int>> nums(n, vector<int>(m, 0));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> nums[i][j];
        }
    }

    // 解题
    vector<pair<int, long long>> scores;
    for (int i = 0; i < nums.size(); ++i) {
        long long sum = 0;
        for (int j = 0; j < nums[i].size(); ++j) {
            sum += nums[i][j];
        }
        scores.push_back({i+1, sum});
    }
    // sort
    sort(scores.begin(), scores.end(),
         [](const pair<int, long long> &lhs, const pair<int, long long> &rhs) {
             if (lhs.second == rhs.second)
                 return lhs.first < rhs.first;
             else
                 return lhs.second > rhs.second;
         });
    // print
    for(int i = 0; i < scores.size(); ++i){
        if(scores[i].first == id){
            cout << i+1 << endl;
            break;
        }
    }
    return 0;
}

第二题:双重循环暴力会超时,可以先排序,然后二分查找,把时间复杂度降到O(nlogn)

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(){
    // 输入数据处理
    double n, k;
    cin >> n >> k;
    vector<double> nums(n, 0);
    for(int i = 0; i < n; ++i){
        cin >> nums[i];
    }
    // solve
    long long ans = 0;
    // sort
    sort(nums.begin(), nums.end());
    for(auto iter = nums.begin(); iter != nums.end(); ++iter){
        auto pos = lower_bound(iter+1, nums.end(), k / (*iter));
        ans += nums.end()-pos;
    }
    cout << ans*2 << endl;
    return 0;
}

第三题:图的遍历。每一次遍历要取相邻两个点组成一对好友,然后再递归到下一个点

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;

vector<bool> vis;
unordered_map<int, vector<int>> myMap;
int ans = INT32_MIN;
void dfs(int idx, int cnt){
    vis[idx] = true;
    for(int n : myMap[idx]){
        if(!vis[n]){
            vis[n] = true;
            cnt++;
            ans = max(ans, cnt);
            for(int nn : myMap[n]){
                if(!vis[nn]) dfs(nn, cnt);
            }
            cnt--;
            vis[n] = false;
        }
    }
    vis[idx] = false;
}
int main(){

    // 输入数据处理
    int n;
    cin >> n;
    vector<int> nums(n-1, 0);
    for(int i = 0; i < n-1; ++i){
        cin >> nums[i];
    }

    // solve
    // map表的构造
    vis.resize(n+1, false); // 1-n
    for(int i = 0; i < nums.size(); ++i){
        myMap[i+2].push_back(nums[i]);
        myMap[nums[i]].push_back(i+2);
    }
    for(int i = 1; i <= n; ++i){
        dfs(i, 0);
    }
    cout << ans << endl;
    return 0;
}
#小红书笔试#
全部评论
我第一题也是这样做的 ,只过了27%
点赞 回复 分享
发布于 2022-08-28 22:06 湖北
第三题是不是有问题呀,比如 10 1 2 2 3 3 6 5 8 2
点赞 回复 分享
发布于 2022-08-28 21:46 江苏

相关推荐

一表renzha:手写数字识别就是一个作业而已
点赞 评论 收藏
分享
评论
6
21
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务