笔试强训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;
}
相关推荐
飞川撸码1 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习1 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法
yzx9910132 小时前
基于 Q-Learning 算法和 CNN 的强化学习实现方案
人工智能·算法·cnn
亮亮爱刷题2 小时前
算法练习-回溯
算法
眼镜哥(with glasses)3 小时前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
int型码农7 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
UFIT8 小时前
NoSQL之redis哨兵
java·前端·算法
喜欢吃燃面8 小时前
C++刷题:日期模拟(1)
c++·学习·算法
SHERlocked938 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
怀旧,8 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法