【强训笔记】day15

NO.1

代码实现:

cpp 复制代码
#include<iostream>
#include<cmath>

using namespace std;
typedef long long ll;

int main()
{
    ll x;
    cin>>x;
    ll a=sqrt(x);
    ll x1=a*a,x2=(a+1)*(a+1);
    if(x-x1<x2-x) cout<<x1<<endl;
    else cout<<x2<<endl;
    return 0;
}

NO.2

思路:暴力枚举。哈希表先统计各个声部的种类的人数并且知道最多人数是多少,如果种类多于我们要分的组数,那么直接输出-1,否则从1开始到最大人数遍历直到实现分组实现所分的组数小于m,分组的时候,让人数除以遍历的i,如果有余数就多分一组。

代码实现:

cpp 复制代码
#include<iostream>
#include <unordered_map>

using namespace std;

unordered_map<int, int> cnt;
int n,m;


bool check(int x)
{
    int g=0;
    for(auto& [a,b]:cnt)
    {
        g+=b/x+(b%x==0?0:1);
    }
    return g<=m;
}
int main()
{
    cin>>n>>m;
    int hmax=0;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        hmax=max(hmax,++cnt[x]);
    }
    
    int kinds=cnt.size();
    if(kinds>m) cout<<-1<<endl;
    else
    {
        for(int i=1;i<hmax;i++)
        {
            if(check(i))
            {
                cout<<i<<endl;
                break;
            }
            
        }
    }
    
    return 0;
}

二分法优化代码:中间位置比较特殊,中间位置左边都是大于m组的,左边都是小于等于m组的。

cpp 复制代码
#include<iostream>
#include <unordered_map>

using namespace std;

unordered_map<int, int> cnt;
int n,m;


bool check(int x)
{
    int g=0;
    for(auto& [a,b]:cnt)
    {
        g+=b/x+(b%x==0?0:1);
    }
    return g<=m;
}
int main()
{
    cin>>n>>m;
    int hmax=0;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        hmax=max(hmax,++cnt[x]);
    }
    
    int kinds=cnt.size();
    if(kinds>m) cout<<-1<<endl;
    else
    {
        int l=1,r=hmax;
        while(l<r)
        {
            int mid=(l+r)/2;
            if(check(mid)) r=mid;
            else l=mid+1;
        }
         cout<<l<<endl;   
        
    }
    
    return 0;
}

NO.3

代码实现:

cpp 复制代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 2e5 + 10;
vector<vector<int>> edges(N); // edges[i] 表⽰ i 这个点所连接的边的信息
int in[N]; // 统计⼊度信息
int n, m;
queue<int> q;
vector<int> ret; // 记录最终结果
int main()
{
	cin >> n >> m;
	while (m--)
	{
			int a, b;
		cin >> a >> b;
		edges[a].push_back(b); // 存储边的信息
		in[b]++; // 存储⼊度
	}
	for (int i = 1; i <= n; i++) // 把⼊度为 0 的点放进队列中
	{
		if (in[i] == 0)
		{
			q.push(i);
		}
	}
	while (q.size())
	{
		int a = q.front();
		q.pop();
		ret.push_back(a);
		for (auto b : edges[a])
		{
			if (--in[b] == 0)
			{
				q.push(b);
			}
		}
	}
	// 判断
	if (ret.size() == n)
	{
		for (int i = 0; i < n - 1; i++)
		{
			cout << ret[i] << " ";
		}
		cout << ret[n - 1]; // 测评会考虑最后⼀个元素的空格
	}
	else
	{
		cout << -1 << endl;
	}
	return 0;
}
相关推荐
2401_8685347820 小时前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
wabs66620 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing20 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
一米阳光866121 小时前
软考(中级)软件设计师核心笔记(6)系统开发基础——需求分析、系统设计
笔记·职场发展·需求分析·软考·软件设计师·中级职称
郝学胜-神的一滴21 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi202621 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog21 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt1 天前
自制交叉线路识别算法
算法
手写码匠1 天前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区1 天前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法