当前位置: 首页 > article >正文

笔试强训day15

平方数

牛妹是一个喜欢完全平方数的女孩子。
牛妹每次看到一个数 x,都想求出离 x 最近的完全平方数 y。
每次手算太麻烦,所以牛妹希望你能写个程序帮她解决这个问题。
形式化地讲,你需要求出一个正整数 y,满足 y 可以表示成 a2a^2a2(a 是正整数),使得 |x-y| 的值最小。可以证明这样的 y 是唯一的。

输入描述:

一行,一个整数 x (1≤x≤1012)x\ (1\le x\le 10^{12})x (1≤x≤1012),表示牛妹询问的数。

输出描述:

一行,一个整数 y,表示离 x 最近的完全平方数 y。
#include <iostream>
#include <cmath>
#define int long long
using namespace std;

signed main()
{
    int n;
    cin>>n;
    int x = sqrt(n);
    int a = x*x,b = (x+1)*(x+1);
    cout<<(n-a<b-n?a:b)<<endl;
    return 0;
}

分组

dd当上了宣传委员,开始组织迎新晚会,已知班里有nnn个同学,每个同学有且仅有一个擅长的声部,把同学们分成恰好mmm组,为了不搞砸节目,每一组里的同学都必须擅长同一个声部,当然,不同组同学擅长同一个声部的情况是可以出现的,毕竟一个声部也可以分成好几个part进行表演,但是他不希望出现任何一组的人过多,否则可能会导致场地分配不协调,也就是说,她希望人数最多的小组的人尽可能少,除此之外,对组内人员分配没有其他要求,她希望你告诉她,这个值是多少,如果无法顺利安排,请输出-1

输入描述:

第一行两个数个数n,m(1≤m≤n≤100000)表示人数
接下来一行n个数,a[i](1≤a[i]≤n)表示第i个学生的擅长声部

输出描述:

输出一个数,表示人数最多的小组的人数
//暴力做法

#include <bits/stdc++.h>

using namespace std;
int n,m;
unordered_map<int,int>hx;

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

#include <bits/stdc++.h>

using namespace std;
int n,m;
unordered_map<int,int>hx;

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

拓扑排序

给定一个包含�n个点�m条边的有向无环图,求出该图的拓扑序。若图的拓扑序不唯一,输出任意合法的拓扑序即可。若该图不能拓扑排序,输出−1−1。

输入描述:

第一行输入两个整数�,�n,m ( 1≤�,�≤2⋅1051≤n,m≤2⋅105),表示点的个数和边的条数。
接下来的�m行,每行输入两个整数��,��u**i​,v**i​ (1≤�,�≤�1≤u,vn),表示��u**i​到��v**i​之间有一条有向边。

输出描述:

若图存在拓扑序,输出一行�n个整数,表示拓扑序。否则输出−1−1。

#include <bits/stdc++.h>

using namespace std;
int n, m;
const int N = 2e5 + 10;
vector<vector<int> >edges(N);
int in[N];
queue<int>q;
vector<int>ans;

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        edges[u].push_back(v);
        in[v]++;
    }
    for (int i = 1; i <= n; ++i) {
        if (in[i] == 0) {
            q.push(i);
        }
    }
    while (!q.empty()) {
        int t = q.front();
        q.pop();
        ans.push_back(t);
        for (int& x : edges[t]) {
            if (--in[x] == 0) {
                q.push(x);
            }
        }
    }
    if (ans.size() == n) {
        for (int i = 0; i < n - 1; i++) {
            cout << ans[i] << " ";
        }
        cout << ans[n - 1]; // 测评会考虑最后⼀个元素的空格
    } else {
        cout << -1 << endl;
    }
    return 0;
}

http://www.kler.cn/news/309655.html

相关文章:

  • Oracle SQL injection(SQL注入)
  • XML映射器-动态sql
  • 51单片机-直流电机(PWM:脉冲宽度调制)实验-会呼吸的灯直流电机调速
  • 通过WinCC在ARMxy边缘计算网关上实现智能制造
  • “杏鲍菇驱动机器人创新前行:康奈尔大学最新研究亮相Science子刊“
  • uniapp 苹果安全域适配
  • 2024.9.14
  • python怎么写csv文件
  • 特效【生日视频制作】小车汽车黄金色版悍马车身AE模板修改文字软件生成器教程特效素材【AE模板】
  • Python | Leetcode Python题解之第406题根据身高重建队列
  • 三维数字图像相关法(3D-DIC)用于复合材料力学性能测试
  • 量化交易backtrader实践(一)_数据获取篇(3)_爬取数据
  • 直播开播极速流,如何有效接入?
  • RK3588人工智能学习笔记-rknn_server代理服务使用介绍
  • 清理C盘缓存,如何针对Windows10系统,专业地调整和优化C盘缓存设置
  • ESP-01S,ESP8266设置客户端透传模式
  • Nginx节点健康检查与自动上下线管理脚本,推送告警到企业微信
  • 解决Windows桌面或文件夹不自动刷新
  • 五种嵌入式中常见网络协议栈
  • 探索物联网 (IoT):从概念到应用
  • [性能]高速收发的TCP/MQTT通信
  • docker时区修改
  • linux网络编程1
  • iOS六大设计原则设计模式
  • c++9月18日
  • [C++] 剖析多态的原理及实现
  • 深入了解单元测试框架:JUnit 5、Mockito和 AssertJ
  • 前端项目优化:极致最优 vs 相对最优 —— 深入探索与实践
  • App Fiddler抓包配置
  • arm