【算法实验】实验3

实验3-1 快速排序

#include<bits/stdc++.h>
using namespace std;
void Quicksort(int arry[],int L,int R)
{
	if(L>=R) return ;
	int left=L,right=R;
	int pivot=arry[left];
	while(left<right)
	{
		while(left<right&&arry[right]>=pivot)
		right--;
		if(left<right)
		arry[left]=arry[right];
		while(left<right&&arry[left]<=pivot)
		left++;
		if(left<right) arry[right]=arry[left];
		if(left>=right) arry[left]=pivot;
	}
	Quicksort(arry,L,right-1);
	Quicksort(arry,right+1,R);
		
	 } 
int main()
{
	int ans[5]={2,5,3,6,1};
	Quicksort(ans,0,4);
	for(int i=0;i<5;i++)
	cout<<ans[i]<<endl;
}

实验3-2 众数问题

问题描述:

  给定含有n 个元素的多重集合S,每个元素在S 中出现的次数称为该元素的重数。多重集S 中重数最大的元素称为众数。

  

例如,S={1,2,2,2,3,5}。

多重集S 的众数是2,其重数为3。

编程任务:

  对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。

数据输入:

  输入数据由文件名为input.txt 的文本文件提供。文件的第1 行多重集S 中元素个数n;接下来的n 行中,每行有一个自然数。

结果输出:

  程序运行结束时,将计算结果输出到文件output.txt 中。输出文件有2 行,第1 行给出众数,第2 行是重数。

输入文件示例          输出文件示例

input.txt             output.txt

6                      2

1                      3

2

2

2

3

5

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x7f7f7f;

typedef struct node{
	int num;
	int index;
}node;
node a[N];
bool cmp(node aa,node bb)
{
	return aa.num>bb.num;
}
int main()
{
	int n,x;
	cin >> n;
	for(int i = 1 ; i <= n ; i ++ )
	{
		cin >> x;
		a[x].num ++ ;
		a[x].index = x;
	}
	sort(a,a+1010,cmp);
	cout << a[0].index;
}

算法思路

先把数组排序Q,对于一个排好序的长度为数组a,我们可以通过中位数将数组分成3部分一中位数左边的部分、中位数、中位数右边

的部分:

用两个指针l和r分别指向中位数第一次出现的位置和最后一次出现的下一个位置,r-l即为该中位数的重数cnt,如果cnt大于当前最大

的重数maxcnt,我们就将该中位数更新为众数,cnt更新为maxcnt;

如果中位数左边部分的长度大于maxcnt,说明该部分可能存在众数,将其递归;

如果中位数右边部分的长度大于maxcnt,说明该部分可能存在众数,将其递归;

当递归不再进行时,说明整个数组的众数已找到。

 

实验3-3 最近点对问题

【问题描述】给定平面中的n个点,要求使用【分治策略】找到其中的一对点,使得在n个点对组成的所有点对中,该点对间的距离最小。
【输入形式】输入的第1行中有一个整数n,表示平面上点的个数;接下来的n行,每行有两个整数,分别表示一个点的横坐标和纵坐标。

【输出形式】输出1行一个浮点数,表示最接近点对的距离,结果保留2位小数。

【样例输入】

3

0 0

0 1

0 8

【样例输出】

1.00

借鉴平面最近点对的分治做法及其证明_第二题(较难,选做题,做出来的加3分)题目描述给定平面上n个点,找出其中的一对-CSDN博客

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
#define Inf 1<<31-1
struct node{
	double x;
	double y;
};
const int N=300005;
struct node point[N];
int mpt[N];
double dis(node a,node b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp1(node a,node b)
{
	if(a.x==b.x)return a.y<b.y;
	return a.x<b.x;
}
bool cmp2(int a,int b)
{
	return point[a].y<point[b].y;
}
double run(int left,int right)
{
	int d=Inf; 
	if(left==right)return d; 
	if(left+1==right)return dis(point[left],point[right]);
	int mid=(left+right)>>1;
	double d1=run(mid,right);
	double d2=run(left,mid-1);
	double minn=min(d1,d2);
	int k=0;
	for(int i=left;i<=right;i++)
	{
		if(fabs(point[mid].x-point[i].x)<=minn)
		{
			mpt[++k]=i;
		}
	}
	sort(mpt+1,mpt+k+1,cmp2); 
	for(int i=1;i<=k;i++)
	{
		for(int j=i+1;j<=k && point[mpt[j]].y-point[mpt[i]].y<=minn;j++)
		{
			if(minn>=dis(point[mpt[i]],point[mpt[j]]))
				minn=dis(point[mpt[i]],point[mpt[j]]);
		}
	}
	return minn;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>point[i].x>>point[i].y;
	}
	sort(point+1,point+n+1,cmp1);
	printf("%.2lf",run(1,n));
	return 0;
}
// 感觉从来都没写过最近点对问题的 O(nlgn) 做法
// 心血来潮,写一次

// Author: GGN_2015
// Date  : 2022-03-23

// 基本思想:在回归时进行归并排序 
// 从而保证合并在 O(n) 时间内完成 
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;

const int maxn = 100000 + 6;
const long long inf = 0x7f7f7f7f7f7f7f7fLL;

struct Point {int x, y;} ps[maxn];           // 用结构体储存所有的点坐标 


Point Ltmp[maxn], Rtmp[maxn];                // 临时数组 
int lcnt, rcnt;


bool cmpx(const Point& A, const Point& B) {  // 按照 x 坐标进行排序 
    return A.x != B.x ? A.x < B.x : A.y < B.y; 
}


long long sqr(int x) {                       // 计算平方(注意 long long) 
    return (long long)x * x;
}
long long dis(const Point& A, const Point& B) {
    return sqr(A.x - B.x) + sqr(A.y - B.y);  // 计算两点间距离的平方 
}


void merge(int L, int mid, int R) {          // 按照 y 坐标进行归并排序的合并操作 
    lcnt = 0;                                // 借用 Ltmp 临时数组进行归并排序 
    int i = L, j = mid + 1;                  // i, j 分别为左侧数组和右侧数组的 "当前元素" 
    while(i <= mid && j <= R) {
        if(ps[i].y != ps[j].y ? ps[i].y < ps[j].y : ps[i].x < ps[j].x) {
                                             // 按照 y 坐标从小到大排序 
            Ltmp[++ lcnt] = ps[i];
            i ++;
        }else {
            Ltmp[++ lcnt] = ps[j];
            j ++;
        }
    }
    while(i <= mid) {                        // 左侧数组中仍有剩余元素 
        Ltmp[++ lcnt] = ps[i];
        i ++;
    }
    while(j <= R) {                          // 右侧数组中仍有剩余元素 
        Ltmp[++ lcnt] = ps[j];
        j ++;
    }
    for(int i = 1; i <= lcnt; i ++) {        // 将临时数组中的数据拷贝回 ps 数组 
        ps[L + i - 1] = Ltmp[i];
    }
}


long long solve(int L, int R) { // 递归计算区间 [L, R] 的最小距离,并将点按照 y 坐标排序 
    if(L >= R) return inf;                   // 空区间 / 只有一个节点的区间不需要计算 
    int mid  = (L + R) / 2;
    int midx = ps[mid].x;
    long long lans = solve(L,mid);        // 递归计算左半区间和右半区间 
    long long rans = solve(mid+1,R);
    long long D = min(lans, rans);
    long long mindis = inf;
    lcnt = 0;
    for(int i = L; i <= mid; i ++) { // 载入左半区间距中轴线距离 <= sqrt(mindis) 的点 
        if(sqr(midx - ps[i].x) <= D) {
            Ltmp[++ lcnt] = ps[i];
        }
    }
    rcnt = 0;
    for(int i = mid+1; i <= R; i ++) {// 载入右半区间距中轴线距离 <= sqrt(mindis) 的点 
        if(sqr(ps[i].x - midx) <= D) {
            Rtmp[++ rcnt] = ps[i];
        }
    }
                                    // 注:Ltmp 和 Rtmp 中的数据是按照 Y 坐标有序的 
    int lpos = 1, rpos = 0;
    for(int i = 1; i <= lcnt; i ++) {        // 枚举 Ltmp 中的点的点 
        while(rpos < rcnt && 
            (Rtmp[rpos + 1].y < Ltmp[i].y || sqr(Rtmp[rpos + 1].y - Ltmp[i].y) <= D)) {
            rpos ++;
        }
        while(lpos < rcnt && Ltmp[i].y > Rtmp[lpos].y && sqr(Ltmp[i].y - Rtmp[lpos].y) > D) {
            lpos ++;
        }
        for(int j = lpos; j <= rpos; j ++) { // Rtmp[lpos .. rpos] 是 日字形中的点 
            mindis = min(mindis, dis(Ltmp[i], Rtmp[j]));
        }
    }
    merge(L, mid, R);                        // 归并排序的合并操作 
    return min(D, mindis);
}


int main() {
    int n; scanf("%d", &n);
    for(int i = 1; i <= n; i ++) {           // 输入所有点的坐标 
        scanf("%d%d", &ps[i].x, &ps[i].y);
    }
    sort(ps + 1, ps + n + 1, cmpx);          // 调了一下午发现忘排序了 ......
    long long ans = solve(1, n);             // 递归计算 
    printf("%.4lf\n", sqrt(ans));            // 输出最近点对距离 
    return 0;
}

实验3-4 最长递减子序列

【问题描述】

求一个数组的最长递减子序列。递减子序列指的是此子序列数字大小满足从大到小有序。例如序列(10,9,2,5,3,7,101,18),其递减子序列为(10,9,5,3),其长度为4。请使用动态规划设计算法,编程计算最长递减子序列长度。

【输入形式】

第1 行是正整数m(0≤m≤10000), 表示序列长度。下一行开始输出m个整数序列。

【输出形式】

程序运行结束时,将计算出的最长递减子序列长度输出。

【样例输入】

7

7 5 4 8 9 4 10

【样例输出】

3

【样例说明】
【评分标准】

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N],dp[N];
int main()
{
	int n;
	cin >> n;
	for(int i = 1; i <= n ; i ++ )
	{
		cin >> a[i];
	}
	for(int i = 1; i <= n ; i ++ )
	{
		dp[i] = 1;
		for(int j = 1; j < i; j ++)
		{
			if(a[j] > a[i])
			{
				dp[i] = max(dp[i] ,dp[j] + 1 );
			}
		}
	}
	int maxn = dp[1];
	for(int i = 2 ; i <= n ; i ++ )
	{
		maxn = max(maxn , dp[i]);
	}
	cout << maxn ;
	return 0;
}

实验3-5 动归解二项式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SD-WAN企业组网:实现高效、安全的跨国企业连接

在当今数字化时代&#xff0c;企业日益全球化&#xff0c;跨国办公成为常态。为了应对这一挑战&#xff0c;越来越多的企业选择采用先进的网络技术&#xff0c;其中SD-WAN&#xff08;软件定义广域网&#xff09;便是一种备受青睐的解决方案。 什么是SD-WAN企业组网&#xff1…

beego的模块篇 - I18n国际化

1. i18n 安装导入 安装该模块&#xff1a; go get github.com/beego/i18n 导入引用包&#xff1a; import ("github.com/beego/i18n" ) conf 目录下就有 locale_en-US.ini 和 locale_zh-CN.ini 两个本地化文件。 本地化文件的文件名和后缀是随意的&#xff0c;不…

鸿蒙HarmonyOS实战-ArkTS语言(基本语法)

&#x1f680;一、ArkTS语言基本语法 &#x1f50e;1.简介 HarmonyOS的ArkTS语言是一种基于TypeScript开发的语言&#xff0c;它专为HarmonyOS系统开发而设计。ArkTS语言结合了JavaScript的灵活性和TypeScript的严谨性&#xff0c;使得开发者能够快速、高效地开发出高质量的Har…

tx2开发板升级JetPack至最新

最近一个项目用到了tx2, 上面的jetpack太老了需要更新&#xff0c;很久没和开发板打交道了&#xff0c;记录一下。中间没怎么截图&#xff0c;所以可能文字居多。 准备工作 Ubuntu 18.04的机器&#xff0c;避免有坑&#xff0c;不要使用虚拟机&#xff0c;一定要是物理机&…

上海智慧岛大数据云计算中心项目正式封顶!

上海智慧岛大数据云计算中心封顶仪式现场 1月15日&#xff0c;云端股份在上海智慧岛大数据云计算中心举行封顶仪式。云之端网络&#xff08;江苏&#xff09;股份有限公司&#xff08;以下称“云端股份”&#xff09;总经理贡伟力先生&#xff0c;常务副总张靖先生等公司成员&…

孚盟云 多处SQL注入漏洞复现

0x01 产品简介 上海孚盟软件有限公司是一家外贸SaaS服务提供商,也是专业的外贸行业解决方案专业提供商。 全新的孚盟云产品,让用户可以用云模式实现信息化管理,让用户的异地办公更加流畅,大大降低中小企业在信息化上成本,用最小的投入享受大型企业级别的信息化服务,使中…

[绍棠] docxtemplater实现纯前端导出word

1.下载需要的依赖 2.util文件夹下创建doc.js文件 doc.js import docxtemplater from docxtemplater import PizZip from pizzip import JSZipUtils from jszip-utils import { saveAs } from file-saver import ImageModule from "docxtemplater-image-module-free"…

值得分享的几个免费数据采集软件

在当今信息时代&#xff0c;获取大量有价值的数据对于企业决策、学术研究或个人项目都至关重要。而数据采集软件的出现为用户提供了便捷、高效的方式&#xff0c;可以从各种来源采集所需信息。本文将专心分享六个免费的数据采集软件&#xff0c;其中强调的是147采集软件&#x…

使用Sqoop从Oracle数据库导入数据

在大数据领域&#xff0c;将数据从关系型数据库&#xff08;如Oracle&#xff09;导入到Hadoop生态系统是一项常见的任务。Sqoop是一个强大的工具&#xff0c;可以帮助轻松完成这项任务。本文将提供详细的指南&#xff0c;以及丰富的示例代码&#xff0c;帮助了解如何使用Sqoop…

Linux系统——学不动了 玩一玩

你的城市下雨了吗 curl http://wttr.in 艺术字 [rootlocalhost ~]#yum install figlet -y 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile* base: mirrors.bfsu.edu.cn* epel: mirror.nyist.edu.cn* extras: mirrors.nju.edu.…

禅道安装使用以及整个流程的泳道图

目录 1.禅道的安装地址 2.禅道的安装 3.禅道的使用 3.1.产品经历的角色 3.2项目经理角色 3.3测试主管的角色 3.4研发角色 4.泳道图 1.禅道的安装地址 安装地址&#xff1a;项目管理软件 开源项目管理软件 免费项目管理软件 IPD管理软件 - 禅道开源项目管理软件 wind…

Java线程池实现原理及其在美团业务中的实践

Java线程池实现原理及其在美团业务中的实践 随着计算机行业的飞速发展&#xff0c;摩尔定律逐渐失效&#xff0c;多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池&#xff1a;ThreadPoolExecutor类&#xff0c;帮助开发人员…

如何用“CentOS7 安装Mysql”?

1、 yum安装更方便 yum install wget 2、 新建文件夹 [rootlocalhost bin]# cd /usr/local/ [rootlocalhost local]# mkdir mysql [rootlocalhost local]# cd mysql [rootlocalhost mysql]# 3、 下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mys…

【LGR-172-Div.4】洛谷入门赛 #19(A—H,c++详解!)

文章目录 【LGR-172-Div.4】洛谷入门赛 #19A.分饼干 I题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例解释 1样例解释 2数据范围与约定思路: 代码 B.分饼干 II题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样…

网络安全与人工智能的交叉点

网络安全和人工智能 (AI) 的联系日益紧密&#xff0c;人工智能在增强网络安全措施方面发挥着重要作用。这种集成并不新鲜&#xff0c;但随着技术的进步和网络威胁变得更加复杂&#xff0c;它已经随着时间的推移而发展。 在网络安全的早期&#xff0c;防火墙和防病毒软件等传统…

禅道的基本使用

目录 一.概述 1.1 禅道简介 1.2 禅道的特点 二.禅道的下载与安装 2.1 下载 2.2 安装 三.禅道的使用 3.1 公司名修改 3.2 添加部门 3.3 添加用户 3.4 查看权限 四.产品经理使用禅道 4.1 添加产品 4.2 添加产品模块 4.3 添加产品计划 4.4 添加产品需求 4.5 创建项目 4.6 设置…

Qt之使用图片填充QLabel

文章目录 前言实现步骤 前言 本文记录一下使用 QLabel 实现在我们设计的 ui 界面上显示指定的图片&#xff0c;即使用 label 插入图片。 实现步骤 1、右键项目&#xff0c;选择 Add New 2、在弹出对话框中选择“Qt Resource File” 3、命名 qrc 文件并选择添加的文件路径。…

强缓存、协商缓存(浏览器的缓存机制)是么子?

文章目录 一.为什么要用强缓存和协商缓存&#xff1f;二.什么是强缓存&#xff1f;三.什么是协商缓存&#xff1f;四.总结 一.为什么要用强缓存和协商缓存&#xff1f; 为了减少资源请求次数&#xff0c;加快资源访问速度&#xff0c;浏览器会对资源文件如图片、css文件、js文…

Vue四个阶段,八个钩子函数

- 创造阶段&#xff1a;创建Vue实例和初始化数据事件&#xff0c;数据代理&#xff0c;监测watch - beforeCreate&#xff0c;只是创建实例&#xff0c;不能this.$el,this.msg,this.方法名&#xff08;&#xff09; - created&#xff0c;数据代理了&#xff0c;能v…

MATLAB - 使用 RRT 进行挖掘机运动规划

系列文章目录 前言 本例演示了如何使用运动规划器在包含障碍物的环境中为挖掘机规划路径。在此示例中&#xff0c;您将以运动树的简化形式为挖掘机建模&#xff0c;然后使用基于采样的运动规划器确定挖掘机在存在障碍物的两个姿势之间的可行路径。在 Simscape™ 多体™ 模型中…