9/26蚂蚁笔试(没a)

t1:二分,但是注意直接算会爆ull,记得改用除法就可以过

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <stack>
#include <unordered_map>
using namespace std;

#define pii pair<int,int>
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(ll i=(a);i<(b);i++)
#define PB push_back
#define PF push_front
#define LB lower_bound
#define UB upper_bound
#define se second
#define fi first
typedef vector<ll> VLL;
typedef vector<int> VI;
#define lowbit(x) ((x)&(-(x)))
#define bitcnt(x) (__builtin_popcountll(x))

int main() {
    ull m; cin >> m;
    ull n = 2*m-1;
    ull l = 1; ull r = n;
    while(l < r) {
        ull mid = (l+r)>>1;
        if ((2*m-1+mid)/mid < mid) {
            r = mid;
        } else {
            l = mid+1;
        }
    }
    if ((2*m-1+l)/l < l) {
        cout << l-1 << endl;
    } else {
        cout << l << endl;
    }
    return 0;
}

t2:还是二分

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <stack>
#include <unordered_map>
using namespace std;

#define pii pair<int,int>
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(ll i=(a);i<(b);i++)
#define PB push_back
#define PF push_front
#define LB lower_bound
#define UB upper_bound
#define se second
#define fi first
typedef vector<ll> VLL;
typedef vector<int> VI;
#define lowbit(x) ((x)&(-(x)))
#define bitcnt(x) (__builtin_popcountll(x))

int main() {
    ll n; ll k; cin >> n >> k;
    string s; cin >> s;
    unordered_map<char, int> map;
    rep(i, 0, n) {
        map[s[i]-'a']++;
    }
    if (map.size() > k) { cout << -1 << endl; return 0; }
    int r = n; int l = 1;
    while(l < r) {
        int mid = (l+r)>>1;
        int sum = 0;
        for (auto&& it : map) {
            sum += (it.second+mid-1)/mid;
        }
        if (sum > k) {
            l = mid+1;
        } else {
            r = mid;
        }
    }
    cout << l << endl;
    return 0;
}

t3:写了快一个小时没a掉,我的思路是找出所有叶子结点,计算所有叶子结点间的距离,然后从所有叶子结点中选出2个距离最大的,分别标记一个颜色,然后再从剩下的叶子结点里选两个距离最大的,设置合适的颜色,重复这个步骤直到所有叶子结点都被标记。然后从所有叶子结点多头bfs,没有被染色的结点就被染色成bfs过来的上一个结点的颜色,只过了26+%

其实写完第一版代码就只剩10分钟了,第一次交过了20%,后来修了点bug多过了点,但是代码其实还没写完。不知道这种方法OK不OK,有没有大佬a了的看看解法,附题目

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <utility>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <unordered_map>
using namespace std;

#define pii pair<int,int>
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(ll i=(a);i<(b);i++)
#define PB push_back
#define PF push_front
#define LB lower_bound
#define UB upper_bound
#define se second
#define fi first
typedef vector<ll> VLL;
typedef vector<int> VI;
#define lowbit(x) ((x)&(-(x)))
#define bitcnt(x) (__builtin_popcountll(x))

void bfs(unordered_map<int, vector<int>> edge_map, int cur, vector<bool>& visited, vector<vector<int>>& distance, vector<int> leaves) {
    visited[cur] = true;
    if (edge_map[cur].size() == 1) return;
    rep(i, 0, edge_map[cur].size()) {
        int target = edge_map[cur][i];
        if (visited[target]) continue;
        bfs(edge_map, target, visited, distance, leaves);
        rep(j, 0, leaves.size()) {
            distance[cur][leaves[j]] = min(distance[cur][leaves[j]], 1+distance[target][leaves[j]]);
        }
    }
    return;
}

int main() {
    ll n; cin >> n;
    unordered_map<int, vector<int>> edge_map;
    vector<int> leaves;
    vector<vector<int>> distance(n+1, vector<int>(n+1));
    vector<bool> color(n+1);
    rep(i, 0, n-1) {
        int from, to; cin >> from >> to;
        edge_map[from].push_back(to);
        edge_map[to].push_back(from);
    }
    for (auto&& it : edge_map) {
        if (it.second.size() == 1) {
            leaves.push_back(it.first);
        }
    }
    for (int i = 0; i < leaves.size(); i++) {
        for (int j = 0; j < leaves.size(); j++) {
            if (i != j)
                distance[leaves[i]][leaves[j]] = n;
        }
    }
    vector<bool> visited(n+1);
    bfs(edge_map, 1, visited, distance, leaves);
    // 最大的直径一定在两个叶子结点间产生
    // 这两个一定要染成不同颜色
    // 计算所有叶子结点之间的距离
    // 确定所有叶子结点的颜色后,从每个叶子结点开始染色
    unordered_map<int, bool> colored; int left = n; queue<int> q; 
    while(left > n-leaves.size()) {
        pair<int, int> big_pair = make_pair(0, 0);
        for (int i = 0; i < leaves.size(); i++) {
            for (int j = i+1; j < leaves.size(); j++) {
                if (distance[leaves[j]][leaves[i]] > distance[big_pair.fi][big_pair.se] && !(colored[leaves[i]] && colored[leaves[j]]))
                    big_pair = make_pair(leaves[i], leaves[j]);
            }
        }
        if (colored[big_pair.fi]) { color[big_pair.se] = ~color[big_pair.fi]; q.push(big_pair.se); colored[big_pair.fi] = true; left--; }
        else if (colored[big_pair.se])  { color[big_pair.fi] = ~color[big_pair.se]; colored[big_pair.se] = true; left--; q.push(big_pair.fi); }
        else {
            color[big_pair.fi] = true; // true: R, false: B
            colored[big_pair.fi] = true; left--;
            colored[big_pair.se] = true; left--;
            q.push(big_pair.fi); q.push(big_pair.se);
        }
        
    }
    while(q.size() > 0) {
        int cur = q.front(); q.pop();
        for (auto next : edge_map[cur]) {
            if (colored[next]) continue;
            colored[next] = true;
            color[next] = color[cur];
            q.push(next);
        }
    }
    for (int i = 1; i <= n; i++) {
        cout << (color[i]?"B":"R");
    }
    cout << endl;
    return 0;
}

#蚂蚁笔试##蚂蚁#
全部评论
第三题写了半小时不会,干脆直接每个位置随机输出R或者B,刷到了31%😋
6 回复 分享
发布于 2023-09-26 21:28 台湾
第一题直接解方程就行,计算从1加到n-2再加(n-1)/2和n/2的值和m比 就是求满足n^2-n+1<=2m的最大n的值即可 一元二次方程求解
1 回复 分享
发布于 2023-09-26 21:47 浙江
第三题算树的直径的两个端点,再计算树所有节点与端点的距离,离哪个端点近就填什么颜色
1 回复 分享
发布于 2023-09-26 21:42 湖南
做完秒挂
点赞 回复 分享
发布于 2023-09-26 22:25 北京
九月初投的蚂蚁,现在才发笔试,估计也是没hc了,纯KPI笔试了估计
点赞 回复 分享
发布于 2023-09-26 21:25 安徽

相关推荐

2025-11-28 11:13
门头沟学院 游戏策划
真顶不住了兄弟们…11&nbsp;月底了,秋招投了仨月,还是&nbsp;0offer,纯纯陪跑选手。从&nbsp;8&nbsp;月底就开始瞎忙活,前俩月还会为了面试挂掉崩溃到睡不着,现在心里早就没波澜了,跟一潭死水似的。不知道从啥时候起,也不焦虑了,就剩摆烂和逃避现实&nbsp;——&nbsp;简历不想改,面试题不想刷,连打开招聘软件的劲儿都没了。中间撑着我往下走的,其实是那点自我安慰:每次收到面试邀约,都告诉自己&nbsp;“挂了也没事,就当练手”,好歹能趁着准备的功夫捋捋项目逻辑,优化下面试话术,只要有进步,总能撞上一个机会。说实话也确实有点变化,从一开始一面就凉,到后来能冲进二面、三面,我还以为事情在往好的方向走…&nbsp;结果后面零星几个面试,又是一面挂、二面挂,无限循环。原来我以为的&nbsp;“进步”,根本就是自我感动的幻觉,说白了就是原地踏步。我到底收获啥了?面试还是那么拉胯,花了无数时间准备材料、练话术、做&nbsp;PPT,到最后连展示的机会都没有,每次都是不明不白被拒,纯属瞎忙活。现在彻底没面试邀约了,希望没了,动力也泄了,只剩下迷茫、麻木,还有点面试&nbsp;PTSD——&nbsp;一想到要面试就犯怵。我承认自己可能不够努力,但每次有机会的时候,我是真的拼尽全力去准备了啊。我还想再挣扎一下,还不想就这么放弃,但现在是真的没头绪了…&nbsp;到底还能做点啥,才能把这秋招的烂摊子盘活啊?
牛客77447303...:老哥没事,我去年双非硕没找到,今年毕业后这个月才接着找,半个月就找到了,给我的感觉就是企业都是需要尽快入职的(至少小企业是这样)。所以不要慌,毕业后社招也许能更快找到工作。
十一月总结
点赞 评论 收藏
分享
评论
2
7
分享

创作者周榜

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