2024年春季学期《算法分析与设计》练习13

news2025/2/27 13:30:55

A:菱形图案

题目描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的菱形图案。

输入

多组输入,一个整数(2~20)。

输出

针对每行输入,输出用“*”组成的菱形,每个“*”后面有一个空格。每输出一个菱形的后面需要空一行。

样例输入 Copy
2
3
4
样例输出 Copy
  * 
 * * 
* * * 
 * * 
  * 

   * 
  * * 
 * * * 
* * * * 
 * * * 
  * * 
   * 

    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 
#include <bits/stdc++.h>
#define ll long long
#define MM 0x3f3f3f3f
using namespace std;
const int N = 1e5 + 5;
const int P = 131;
const int MOD=1e9+7;
void solve(){
    int n;
    while(cin>>n)
    {
        for(int j=0;j<=n;j++)
        {
            for(int i=j;i<n;i++)
                cout<<' ';
            for(int i=0;i<=j;i++)
                cout<<'*'<<' ';
            cout<<"\n";
        }
        for(int j=n;j>0;j--)
        {
            for(int i=j;i<=n;i++)
                cout<<' ';
            for(int i=0;i<j;i++)
                cout<<'*'<<' ';
            cout<<"\n";
        }
        cout<<"\n";
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    solve();
    return 0;
}

 B:X星人的礼物

题目描述

六一儿童节到了,X星人宝宝收到了很多很多礼物。他决定把这些礼物装到自己的礼物箱中。为此,他准备了很多个型号相同的礼物箱,每个礼物箱能够装礼物的最大重量都是一样的。但是X星人宝宝不希望在一个礼物箱里面装太多礼物(可能担心礼物会被压坏吧),每个礼物箱最多只允许装2个礼物
假设X星人宝宝收到了N个礼物,现在给出每一个礼物的重量和一个礼物箱的最大装载量,请你编写一个程序计算X星人宝宝最少要用多少个礼物箱才能够把所有的礼物都装完

输入

单组输入。
每组两行,第1行输入两个正整数,分别表示礼物的数量N和每个礼物箱的最大装载量C,其中1<=N<=1000,1<=C<=100,两者之间用英文空格隔开。
第2行输入N个不超过100的正整数,分别表示每一个礼物的重量,两两之间用英文空格隔开。
输入保证最重的礼物的重量<=C。

输出

针对所输出的数据,输出将所有的礼物全部都装完所需的礼物箱的最少个数。

样例输入 Copy
5 80
20 70 40 30 10
样例输出 Copy
3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e3 +5;
const int M =1e9 +7;
const int inf =0x3fffffff;
int a[N];
void solve(){
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    sort(a, a + n);
    int l = 0, r = n - 1;
    int s = 0;
    while (l <= r)
    {
        if (a[l] + a[r] <= m)
        {
            l++;
            r--;
        }
        else
        {
            r--;
        }
        s++;
    }
    cout << s << "\n";
}
int main() {
    cin.tie(0)->sync_with_stdio(false);
    solve();
    return 0;
}

 C:隔离14天

题目描述

     如果实施更为严格的防控措施,一辆汽车上有一个确诊患者或者密切接触者,那么该汽车上所有的人都被认为是密切接触者,全部需要自行居家隔离或者集中隔离14天。
      现在假定编号为0的乘客冠状病毒核酸检验呈阳性,请编写一个程序统计需隔离的总人数(包括编号为0的乘客)。

输入
第1行的第1个数字n表示总人数,第2个数字m表示汽车数量;从第2行开始,接下来的m行表示每辆汽车的司乘人员总人数和人员编号(人员编号是一个固定值,可以对应于我们的身份证号码),每一行的第1个数字k表示该汽车的司乘人员总数,接下来的k个数字表示每一个人的编号。
输出
需要被隔离的总人数。
样例输入 Copy
100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2
样例输出 Copy
4
​
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e3 +5;
const int M =1e9 +7;
const int inf =0x3fffffff;
int a[N];
int f[N];
int r[N];
void init(int n){
    for(int i=0;i<n;i++){
        f[i]=i;
        r[i]=1;
    }
}
int find(int x){
    return f[x]==x?f[x]:f[x]=find(f[x]);
} 
void solve(){
    int n,m;
    cin>>n>>m;
    init(n);
    while(m--){
        int k;
        cin>>k;
        cin>>a[0];
        for(int i=1;i<k;i++){
            cin>>a[i];
            int x=find(a[i-1]);
            int y=find(a[i]);
            if(x!=y){
                f[x]=y;
                r[y]+=r[x];
            }
        }
    }
    cout<<r[f[0]]<<"\n";
}
int main() {
    cin.tie(0)->sync_with_stdio(false);
    solve();
    return 0;
}

 D:最小生成树(Kruskal)

题目描述

编程实现Kruskal算法,求图的最小生成树(MST)的权重。

输入

每组数据分为两个部分,第一部分为图的点数n,和边数m, 
第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重。 

输出

最小生成树的权重。

样例输入 Copy
3 3
0 1 10
0 2 15
1 2 50
样例输出 Copy
25
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e3 +5;
const int M =1e9 +7;
const int inf =0x3fffffff;
int n, m;
int p[N];
struct edge
{
    int a, b, c;
    bool operator<(const edge& W) const{
        return c < W.c;
    }
}e[N];
int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}
void init()
{
    for (int i = 0; i < n; i++) p[i] = i;
}
void solve()
{
    while(cin>>n>>m){
        memset(e, 0, sizeof(edge) * N);
        for (int i = 0; i < m; i++)
        {
            int a, b, c;
            cin>>a>>b>>c;
            e[i] = { a,b,c };
        }
        sort(e, e + m);
        init();
        int ans = 0;
        for (int i = 0; i < m; i++)
        {
            int a = e[i].a, b = e[i].b, c = e[i].c;
            a = find(a), b = find(b);
            if (a != b)
            {
                p[a] = b;
                ans += c;
            }
        }
        cout << ans << '\n';
    }
     
}
int main() {
    cin.tie(0)->sync_with_stdio(false);
    solve();
    return 0;
}

 E:搭建电路

题目描述

明明迷上了一个搭建电路的游戏。
在游戏中,每次在两个电子元件之间增加一条有效电路(两个元件之间先前没有电路相连)都将获得相应的积分奖励。
已知电子元件数量n和部分电子元件之间的奖励积分值。如何构建一个有效电路将所有元件全部连接起来,并且可以得到最多的积分奖励。

输入

每组输入数据包含m+1行。
第1行输入两个正整数n和m,其中n表示电子元件数量(n<=100),m表示提供了m对电子元件之间的奖励积分值(m<=1000)。两个正整数之间用空格隔开。
第2行到第m+1行对应m对电子元件及其对应的奖励积分值,每一行包含三个正整数,第1个和第2个整数表示电子元件编号(从1开始),第3个整数表示两个元件之间搭建电路的奖励积分num(num<1e9)。整数之间用空格隔开。

输出

每组输出占1行,输出一个正整数,即最多可以得到的积分奖励值。如果没有办法把所有元件全部连接起来,则输出“No solution.”。

样例输入 Copy
3 3
1 2 10
1 3 20
2 3 30
样例输出 Copy
50
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e3 +5;
const int M =1e2 +7;
const int inf =0x3fffffff;
int p[M];
int n, m;
struct Edge
{
    int a, b, c;
    bool operator<(const Edge& Z)const{
        return c > Z.c;
    }
}edge[N];
void init()
{
    for (int i = 1; i <= n; i++) p[i] = i;
}
int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}
void solve()
{
    while(cin>>n>>m){
        memset(edge, 0, sizeof(Edge) * N);
        for (int i = 0; i < m; i++)
        {
            int a, b, c;
            cin>>a>>b>>c;
            edge[i] = { a,b,c };
        }
        sort(edge, edge + m);
        init();
        int cnt = 0, flag = 0;
        ll res = 0;
        for (int i = 0; i < m; i++)
        {
            int a = edge[i].a, b = edge[i].b, c = edge[i].c;
            a = find(a), b = find(b);
            if (a != b)
            {
                p[a] = b;
                res += c;
                cnt++;
            }
            if(cnt == n - 1)
            {
                flag = 1;
                break;
            }
        }
        if (!flag) cout<<"No solution.\n";
        else cout<<res<<"\n";
    }
     
}
int main() {
    cin.tie(0)->sync_with_stdio(false);
    solve();
    return 0;
}

 F:最小生成树(Prim)

题目描述

使用Prim算法求图的最小生成树(MST)

输入

每组数据分为两个部分,第一部分为图的点数n,和边数m,
第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重。

输出

最小生成树,输出时按照边的两个端点的升序输出。(先看左端点,再看右端点,端点不换位置)

样例输入 Copy
3 3
0 1 10
0 2 15
1 2 50
样例输出 Copy
0 1 10
0 2 15
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =5e2 +5;
const int M =1e5 +7;
const int inf =0x3fffffff;
int n,m,res;    
int a,b,c;
int g[N][N],backup[N],dist[N];
bool st[N],stt[N][N];
struct edge
{
    int a,b,c;
    bool operator<(const edge& W)const{
        if(a==W.a) return b<W.b;
        return a<W.a;
    }
}edges[M];
void prim()
{
    res=0;
    for(int i=0;i<n;i++){
        int t=-1;
        for(int j=0;j<n;j++) if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j;
        st[t]=true;
        if(i) 
            if(stt[backup[t]][t]) edges[res++]={backup[t],t,dist[t]};
            else edges[res++]={t,backup[t],dist[t]};
        for(int j=0;j<n;j++) if(!st[j]&&dist[j]>g[t][j]) {
            dist[j]=g[t][j];
            backup[j]=t;
        }
    }
    sort(edges,edges+res);
    for(int i=0;i<res;i++) {
        a=edges[i].a,b=edges[i].b,c=edges[i].c;
        cout<<a<<' '<<b<<' '<<c<<'\n';
    }  
}
void solve()
{
    while(cin>>n>>m){
        memset(g,0x3f,sizeof g);
        memset(dist,0x3f,sizeof dist);
        memset(st,false,sizeof st);
        while(m--){
            cin>>a>>b>>c;
            stt[a][b]=true;
            g[a][b]=g[b][a]=min(g[a][b],c); 
        }
        prim();
    }
}
int main() {
    cin.tie(0)->sync_with_stdio(false);
    solve();
    return 0;
}

 G:台球碰撞

题目描述

在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内)。受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率不变,反射角等于入射角)。

如果球的速率为vs个时间单位之后球心在什么地方?

输入

输入文件最多包含25组测试数据,每个数据仅一行,包含8个正整数L,W,x,y,R,a,v,s(100<=L,W<=105,1<=R<=5, R<=x<=L-RR<=y<=W-R, 0<=a<360, 1<=v,s<=105),含义见题目描述。L=W=x=y=R=a=v=s=0表示输入结束,你的程序不应当处理这一行。

输出

对于每组数据,输出仅一行,包含两个实数xy,表明球心坐标为(x,y)。xy应四舍五入保留两位小数。

样例输入 Copy
100 100 80 10 5 90 2 23
110 100 70 10 5 180 1 9999
0 0 0 0 0 0 0 0
样例输出 Copy

80.00 56.00
71.00 10.00
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =5e2 +5;
const int M =1e5 +7;
const int inf =0x3fffffff;
const double pi = acos(-1.0);
double L,W,x,y,R,a,v;
int s,t; 
double vx,vy;
void solve()
{
    while(cin>>L>>W>>x>>y>>R>>a>>v>>s&&L+W+x+y+R+a+v+s){
        vy=v*sin(a*pi/180),vx=v*cos(a*pi/180);
        t=0;
        while(t!=s){
            x+=vx;
            y+=vy;
            while(x-R<0||x+R>L||y-R<0||y+R>W){
                if(x-R<0) x=2*R-x,vx=-vx;
                if(x+R>L) x=2*L-2*R-x,vx=-vx;
                if(y-R<0) y=2*R-y,vy=-vy;
                if(y+R>W) y=2*W-2*R-y,vy=-vy;
            }
            t++;
        }
        printf("%.2lf %.2lf\n",x,y);
    }
}
int main() {
    cin.tie(0)->sync_with_stdio(false);
    solve();
    return 0;
}

 H:战场的数目(还不会)

题目描述
在上题中,假设战场的图形周长为p,一共有多少种可能的战场?
例如,p<8时没有符合要求的战场,p=8时有2种战场:

p=10有9种战场:

要求输出方案总数模987654321的值。
输入

输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长。p=0表示输入结束,你的程序不应当处理这一行。

输出

对于每组数据,输出仅一行,即满足条件的战场总数除以987654321的余数。

样例输入 Copy
7
8
9
10
0
样例输出 Copy
0
2
0
9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1823529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 18新特性概览与解读

随着技术的不断进步&#xff0c;Java作为最流行的编程语言之一&#xff0c;也在持续地进行版本更新&#xff0c;为开发人员提供更强大、更高效的工具和特性。Java 18作为最新的稳定版本&#xff0c;引入了一系列引人注目的新特性和改进。以下是对Java 18中一些主要新特性的详细…

Petalinux由于网络原因产生的编译错误(3)-qemu-xilinx-system-native 失败

1 获取qemu-xilinx-system-native 失败 编译时遇到qemu-xilinx-system-native 包获取失败&#xff0c;如下图所示&#xff1a; 解决这种错误方法如下&#xff1a; 进入Petalinux 工程&#xff0c;编辑工程下的 project-spec/meta-user/conf/petalinuxbsp.conf 文件&#xff0…

什么是DMZ?路由器上如何使用DMZ?

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 DMZ 📒🚀 DMZ的应用场景💡 路由器设置DMZ🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在网络管理中,DMZ(Demilitarized Zone,隔离区)是一个特殊的网络区域,常用于将公共访问和内部网络隔离开来。DMZ功能允许…

关联规则延伸之协同过滤

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、协同过滤1、含义2、策略 二、基于用户的协同过滤1、寻找相似偏好的用户2、欧式距离及系数3、皮尔逊系数4、其他系数5、算法步骤6、局限性 三、基于物品的协同过滤1、…

php实现一个简单的MySQL分页

一、案例演示: 二、php 代码 <?php $servername = "localhost"; // MySQL服务器名称或IP地址 $username = "root"; // MySQL用户名 $password = "123456"; // MySQL密码 $dbname = "test"; // 要连接的数据…

外盘黄金期货需要注意什么?

为大家整理了关于黄金做单的五大原则&#xff0c;相信对于新手投资者来说肯定会产生一定的帮助。  1、看多空&#xff1a;主要有两种方法&#xff0c;基本面判断和技术面判断&#xff0c;基本面判断&#xff0c;主要是借助基本信息面&#xff0c;如政策。供需&#xff0c;产量…

文字不换行了

单行文字不换行 添加... .line1Text {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer; } 双行文字换行添加... .line2Text {overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;text-overflow: e…

向量化在人工智能领域的深度实践:技术革新与效率提升

在人工智能&#xff08;AI&#xff09;的飞速发展中&#xff0c;向量化技术作为一种基础且关键的数据处理手段&#xff0c;正日益受到广泛关注。向量化是将文本、图像、声音等数据转换为数值向量的过程&#xff0c;这些向量能够表示原始数据的特征和语义信息&#xff0c;为深度…

【gtest】 C++ 的测试框架之使用 gtest 编写单元测试

目录 &#x1f30a;前言 &#x1f30a;使用 cmake 启动并运行 gtest &#x1f30d;1. 设置项目 &#x1f30d;2. 创建并运行二进制文件 &#x1f30a;1. gtest 入门 &#x1f30d;1.1 断言&#xff08;assertions&#xff09; &#x1f30d;1.2 简单测试 &#x1f30d;…

进程(Processes)

在 Elixir 中&#xff0c;所有代码都在进程内运行。进程彼此隔离&#xff0c;彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础&#xff0c;而且还提供了构建分布式和容错程序的方法。 Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU…

如何使用CCS9.3打开CCS3.0工程

如何使用CCS9.3打开CCS3.0工程 点菜单栏上的project&#xff0c;选择Import Legacy CCSv3.3 Porjects…&#xff0c;弹出对话框&#xff0c;通过Browse…按钮导入一个3.3版本的工程项目&#xff1b; 选择.pjt文件&#xff0c;选择Copy projects into worlkspace 右击选择P…

二分查找总结:算法原理,适用题型,经典题单

二分查找 感谢灵神的题单 题单&#xff1a;分享丨【题单】二分算法&#xff08;二分答案/最小化最大值/最大化最小值/第K小&#xff09; - 力扣&#xff08;LeetCode&#xff09; 每天四道题&#xff0c;大概用时一个月刷完&#xff0c;如果没有时间的同学可以学习我总结的算…

中信所:中国科学技术信息研究所-国家科技图书文献中心

文章目录 1. Intro2. History3. Staffing level4. Facility resources5. Scientific achievementsReference国家工程技术数字图书馆 National Engineering and Technology Digital Library 1. Intro 中国科学技术信息研究所(以下简称中信所)是在周恩来总理、聂荣臻元帅等党和…

【CS.AL】算法复杂度分析 —— 渐进符号表示法

文章目录 1 概述2 渐进符号详解2.1 大O符号&#xff08;O&#xff09;2.2 Ω符号&#xff08;Ω&#xff09;2.3 Θ符号&#xff08;Θ&#xff09;2.4 o符号&#xff08;o&#xff09;2.5 ω符号&#xff08;ω&#xff09; 3 具体例子3.1 插入排序&#xff08;Insertion Sort…

GitHub强制双重验证、二次验证之下载微软Authenticator

Download Microsoft Authenticator 如上图&#xff0c;安卓手机在国内&#xff0c;基本没有下载使用的可能。 下载 Microsoft Authenticator 如上图&#xff0c;找到了国内下载渠道&#xff0c;但仅联想商店的新版本适合使用&#xff0c;下载安装即可。

C++11初始化列表打包器initializer_list

有时我们无法提前知道应该向函数传递几个实参。为了编写能处理不同数量实参的函数我们使用initializer_list Cplusplus中的定义&#xff1a; 其里面有三个成员函数 也就是说他是支持迭代器的&#xff0c;支持迭代器就支持范围for 图像理解 函数类型 void Test1_initializer_li…

一手洞悉巴西slot游戏包投放本土网盟CPI广告优势

一手洞悉巴西slot游戏包投放本土网盟CPI广告优势 在巴西这片热土上&#xff0c;slot游戏包的投放本土网盟CPI广告是一项既充满挑战又富有机遇的任务。CPI&#xff08;Cost Per Install&#xff09;广告模式&#xff0c;即按安装付费&#xff0c;已经成为许多游戏开发商推广产品…

ios18新功能:设专属“咒语”动动嘴巴即可操作iphone

苹果 iOS / iPadOS 18 系统引入了“人声快捷指令”&#xff08;Vocal Shortcuts&#xff09;功能&#xff0c;即便iPhone、iPad 处于锁屏状态下&#xff0c;也能响应你的语音命令。 苹果官方对“人声快捷指令”的介绍如下&#xff1a;iPhone 和 iPad 用户可以通过人声快捷指令…

2024牛客网高频精选Java面试八股文整理(附答案)

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人&#xff0c;基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺&#xff0c;而需求量又大&#xff0c;所以这种人才供不应求的现状&#xff0c;就是 Java 工程师的薪…

yolo模型评估指标相关概念

mAP&#xff08;mean Average Precision 平均精度&#xff09;&#xff0c;是一个经常被用来衡量目标 检测模型是否具有较好性能的指标。 计算mAP需要先计算每一类物体的AP&#xff0c;然后取平均值&#xff0c;所以下面介绍的 TP,FP,FN,TN都是针对某一类物体&#xff08;目标&…