笔试强训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;
}
相关推荐
最后一个bug几秒前
rt-linux中使用mlockall与free的差异
linux·c语言·arm开发·单片机·嵌入式硬件·算法
蹉跎x1 小时前
力扣1358. 包含所有三种字符的子字符串数目
数据结构·算法·leetcode·职场和发展
rainoway1 小时前
CRDT宝典 - yata算法
前端·分布式·算法
巫师不要去魔法部乱说2 小时前
PyCharm专项训练4 最小生成树算法
算法·pycharm
IT猿手2 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
阿七想学习2 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
王老师青少年编程3 小时前
gesp(二级)(12)洛谷:B3955:[GESP202403 二级] 小杨的日字矩阵
c++·算法·矩阵·gesp·csp·信奥赛
Kenneth風车3 小时前
【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)111
算法·机器学习·分类
eternal__day3 小时前
数据结构(哈希表(中)纯概念版)
java·数据结构·算法·哈希算法·推荐算法
APP 肖提莫3 小时前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法