笔试强训Day15 二分 图论

平方数

题目链接: 平方数 (nowcoder.com)

思路:水题直接过。

AC code:

cpp 复制代码
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    long long int n; cin >> n;
    long long int a = sqrtl(n);
    long long int b = a + 1;
    if( abs(n - a * a) > abs(n - b * b))
        cout << b * b;
    else cout << a * a;
    return 0;
}

分组

题目链接: E-分组_牛客小白月赛40 (nowcoder.com)

思路:

题目中要求人数最多的小组人尽量少,即可二分每个小组人数。

注意如果小组人数大于 最多人的那个最大值 是不可以的。

多关注下边界条件即可。

AC code:

cpp 复制代码
#include<iostream>
#include<unordered_map>
#include<algorithm>
using namespace std;
unordered_map<int,int> mp;
int n,m;
int cnt;

bool check(int x)
{
    int k = 0;//小组数
    for(auto it : mp)
    {
        if(it.second > x)
            k +=(it.second + x - 1) / x;//向上取整
        else
            k ++;
    }
    if(k > m) return 0;
    return 1;
}

int main()
{
    cin >> n >> m;
    int maxx = -2e9;
    for(int i = 0; i < n; i ++)
    {
        int x; cin >> x;
        mp[x]++;
        maxx = max(maxx, mp[x]);
    }
    int l = 0, r = 1e5 + 10; // 二分小组人数
    
    while(l < r)
    {
        int mid = l + r >> 1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    if(r <= maxx)
        cout << r << endl;
    else 
        cout << -1 << endl;
    
    
    return 0;
}

AB13 【模板】拓扑排序

题目链接: 【模板】拓扑排序_牛客题霸_牛客网 (nowcoder.com)

思路:

模板题 根据入度是否为零 依次入队即可。

AC code:

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;

const int N = 100010;

int h[N], e[N], ne[N], idx;

int q[N], d[N]; // d[N] 入度

int n, m;

void add(int a, int b) {
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}
void topsort() {
    int hh = 0, tt = -1;
    for (int i = 1; i <= n; i++)
        if (d[i] == 0) q[++tt] = i;

    while (hh <= tt) {
        int a = q[hh++];
        for (int i = h[a]; i != -1; i = ne[i]) {
            int j = e[i];
            d[j]-- ;
            if (!d[j]) q[++tt] = j;
        }
    }
    if (tt == n - 1)
        for (int i = 0; i < n; i++) cout << q[i] << " ";
    else
        cout << -1;

}
int main() {
    memset(h, -1, sizeof(h));
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;
        add(a, b);
        d[b]++;
    }
    topsort();

    return 0;
}
相关推荐
Eric.Lee202127 分钟前
数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall
python·深度学习·算法·目标检测·计算机视觉·数据集·螃蟹检测
夜流冰33 分钟前
工具方法 - 面试中回答问题的技巧
面试·职场和发展
林辞忧36 分钟前
算法修炼之路之滑动窗口
算法
￴ㅤ￴￴ㅤ9527超级帅1 小时前
LeetCode hot100---二叉树专题(C++语言)
c++·算法·leetcode
liuyang-neu1 小时前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
penguin_bark1 小时前
LCR 068. 搜索插入位置
算法·leetcode·职场和发展
_GR1 小时前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
ROBIN__dyc1 小时前
表达式
算法
无限大.1 小时前
c语言实例
c语言·数据结构·算法
六点半8882 小时前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法