GXUOJ-算法-第四次作业(圆排列、连续邮资、n皇后、符号三角形)

1.圆排列

问题描述

GXUOJ | 圆排列

代码解答

#include<bits/stdc++.h>
using namespace std;int n;
int r[1000];
double calculate(int r[],int n,double minL){double x,y;double sum=0;for(int i=0;i<n;i++){int x,y;x=r[i];y=r[i+1];//sum+=sqrt((x+y)*(x+y)-(x-y)*(x-y));sum+=sqrt(4*x*y);}sum+=r[0]+r[n-1];minL=min(minL,sum);return minL;
}
int main(){cin>>n;double ans=0x3f3f3f3f;for (int i=0;i<n;i++)cin>>r[i];do{ans=calculate(r,n,ans);}while(next_permutation(r,r+n));printf("%.2f",ans-0.005);	//对结果进行修正 
}

但是这个算法考虑的全是圆相切的情况,并没有考虑如下的情况

圆排列问题详解(原理+代码)_对n个圆的最优排列问题,深度优先遍历其排列树所需要的辅助空间-CSDN博客

 代码更改

#include<bits/stdc++.h>
using namespace std;
const int MAXLEN =1000;
double r[MAXLEN];//存放圆排列的半径
double x[MAXLEN];//存放圆排列的圆心横坐标
double best_r[MAXLEN];//用来记录结果
int N;//输入圆的个数 
double minlen=1000;void compute(){//找到了一个排列 且此半径排列存放在数组r中double low=0,high=0;for(int i=1;i<=N;i++){//算出每一个圆的左边界和右边界if(x[i]-r[i] < low) low = x[i]-r[i];if(x[i]+r[i] > high) high = x[i]+r[i]; }if(high-low<minlen){minlen=high-low;//更新最小长度for(int i=1;i<=N;i++) best_r[i]=r[i];//记录最小排列}
}double center(int t){//计算圆心坐标 double x_max=0;for(int j=1;j<t;j++){//t=1的时候 第一个圆不计算 横坐标记为0 double x_value=x[j]+2.0*sqrt(r[t]*r[j]);if(x_value>x_max) x_max=x_value;//取最大的那个计算值 } return x_max;
}void backtrack(int index){if(index==N+1){//已经找到了一个排列compute();}else{for(int j=index;j<=N;j++){//index之前的已经排列好 index位置依次与后面的交换 swap(r[index],r[j]);double center_x=center(index);//计算当前第t个位置的横坐标if(center_x+r[index]+r[1]<minlen){//如果已经大于维护的最小值 则不必搜索 x[index]=center_x;//存入表示坐标的数组x中backtrack(index+1);//递归选择index+1位置 }swap(r[index],r[j]);//index选择j的情况已经结束 把他换回去 进行下一个交换 }}
}
int main(){cin>>N;//一共N个圆 for(int i=1;i<=N;i++){cin>>r[i];//输入所有圆的半径}backtrack(1);//输出结果 printf("%.2f",minlen-0.005); return 0;
}

2.连续邮资

问题描述

GXUOJ | 连续邮资

代码解答

#include<bits/stdc++.h>
using namespace std;
int n, m;//n为邮票种类,m为一封信上最多贴的邮票个数
int Max;
int ans[10000];//最终答案数组//能否用n种邮票,面值在x数组中,最多贴m张,表示出sum(是个动态规划问题,
//方法是求出dp[n][sum]看它是否小于sum,状态转移方程
//dp[i][j]=min(dp[i-1][j-k*x[i]]+k)(其中dp[i][j]表示用到第i种邮票,
//表示邮资为j的最少邮票
bool panduan(int x[], int n, int sum){//dp[i][j]来表示使用前i种邮票凑出邮资j所需的最少邮票数int dp[15][1005]={0};for (int i = 1; i <= sum; i++)dp[1][i] = i;for (int i = 2; i <= n; i++){for (int j = 1; j <= sum; j++){dp[i][j] = 9999;for (int k = 0; k <= j / x[i]; k++)dp[i][j] = min(dp[i][j], dp[i - 1][j - x[i] * k] + k);}}if (dp[n][sum] > m)return false;return true;
}
void DFS(int x[], int cur, int max){if (cur == n){//如果已经得出了n种邮票if (max > Max){//并且它的最大值已经大于当前最大邮资数Max = max;for (int i = 1; i <= cur; i++)ans[i] = x[i];//更新答案数组}return;}for (int next = x[cur] + 1; next <= max + 1; next++)//如果还没得到n中邮票,那么从x[cur]+1~max+1选一个作为下一个邮资,因为max+1没法表示,所以必定到max+1为止{x[cur + 1] = next;//接下来是重点,用种类为cur+1,数目分别为x[1..cur+1]的邮票,最多使用m张,//能否表示出大于max的某个数int newMax=max;for (int i = max + 1; i <= m * x[cur + 1]; i++){//这个数最少要为max+1(不然没有意义了),最多是x[cur+1]*mif (panduan(x, cur + 1, i) == 0)//如果成立break;newMax=i;}if (newMax> max)//如果至少让最大值更新了一次DFS(x, cur + 1, newMax);}}
int main()
{cin >> n >> m;Max = 0;int x[1000]={0};//中间传递的数组,存储当前的邮票值的解x[1] = 1;DFS(x, 1, m);//x存储当前的解,cur表示当前传递到第几种邮票,max表示目前能表示到的最大值for (int i = 1; i <= n; i++)cout<<ans[i] <<" ";cout << endl;cout << Max;return 0;
}

3.n皇后问题

问题描述

GXUOJ | n皇后问题

代码解答

#include <bits/stdc++.h>
using namespace std;
const int N = 20;// bool数组用来判断搜索的下一个位置是否可行
// col列,dg对角线,udg反对角线
// g[N][N]用来存路径int n;
char g[N][N];
bool col[N], dg[N], udg[N];
int result = 0;void  dfs(int u) {// u == n 表示已经搜了n行,故输出这条路径if (u == n) {result++;return;}// 枚举u这一行,搜索合法的列int x = u;for (int y = 0; y < n; y++)// 剪枝(对于不满足要求的点,不再继续往下搜索)  if (col[y] == false && dg[y - x + n] == false && udg[y + x] == false) {col[y] = dg[y - x + n] = udg[y + x] = true;dfs(x + 1);col[y] = dg[y - x + n] = udg[y + x] = false;}
}int main() {cin >> n;dfs(0);cout << result;return 0;
}

4.符号三角形

问题描述

GXUOJ | 符号三角形

代码解答

#include <bits/stdc++.h>
using namespace std;// n 表示符号三角形第一行的元素个数
//	cnt 用于积累符号三角形中1的元素个数 
int n, cnt = 0; 
// sum 用于统计满足条件的符号三角形的数量
int sum = 0; 
// p 数组用于存储符号三角形,p[i][j] 表示第 i 行第 j 列的元素
int p[25][25]; // 回溯函数,t 表示当前处理到符号三角形第一行的第 t 个位置
void back(int t) {// 剪枝条件:如果当前已经确定的 1 的数量超过了总数的二分之一,或者剩余位置全为 1 时 1 的数量仍超过总数的二分之一,就返回// n*(n + 1)/4 是因为整个符号三角形元素总数为 n*(n + 1)/2 ,1 的数量如果超过一半,就不可能满足 0 和 1 数量相等// t*(t - 1)/2 - cnt 表示假设剩余位置全为 1 时 1 的数量//前t行总元素为 t*(t+1)/2 ,减去 t和 cnt 假设剩余位置全为 1 时 1 的数量 if (cnt > n * (n + 1) / 4 || t * (t - 1) / 2 - cnt > n * (n + 1) / 4) return; // 如果已经处理完符号三角形第一行的所有元素,说明成功构建了一个符号三角形 if (t > n) sum++; else// 尝试在当前位置放置 0 或 1for (int i = 0; i < 2; i++) { // 在符号三角形第一行的第 t 个位置放置 ip[1][t] = i; // 更新当前已确定的 1 的数量cnt += i; // 根据上一行的元素确定当前行的元素for (int j = 2; j <= t; j++) { // 通过异或运算确定当前位置的元素,这里用异或模拟符号三角形的生成规则p[j][t - j + 1] = p[j - 1][t - j + 1] ^ p[j - 1][t - j + 2]; // 更新当前已确定的 1 的数量cnt += p[j][t - j + 1]; }// 递归处理下一个位置back(t + 1); // 回溯,恢复之前的状态,减去当前行已确定的 1 的数量for (int j = 2; j <= t; j++) { cnt -= p[j][t - j + 1]; }// 回溯,恢复之前的状态,减去当前位置放置的 1 的数量cnt -= i; }
}int main() {cin >> n; // 从符号三角形第一行的第一个位置开始回溯back(1); cout << sum; return 0;
}

没有注释版本

#include<bits/stdc++.h>
using namespace std;int n,sum,cnt;
int p[25][25];void back(int t){if(cnt>(n+1)*n/4|| t*(t-1)/2-cnt>(n+1)*n/4)	return;if(t>n) sum++;else{for(int i=0;i<2;i++){p[1][t]=i;cnt+=i;for(int j=2;j<=t;j++){p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];cnt+=p[j][t-j+1]; }back(t+1);for(int j=2;j<=t;j++)cnt-=p[j][t-j+1];cnt-=i;}}
}
int main(){cin>>n;back(1);cout<<sum;return 0;
}

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

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

相关文章

c++最大公约数和最小公倍数的深入剖析

目录 一、概念基础 二、常见算法及深度解析 1. 辗转相除法&#xff08;欧几里得算法&#xff09; 2. 更相减损术 3. 结合辗转相除法和更相减损术&#xff08;优化算法&#xff09; 三、应用场景全面举例 1. 化简分数 2. 判断互质关系 一、什么是最小公倍数 二、求最小…

【PCIe 总线及设备入门学习专栏 4.5 -- PCIe Message and PCIe MSI】

文章目录 PCIe Message 与 MSIPCIe Message 和 MSI 的作用与关系MSI 的配置与寄存器MSI 和 ARM GIC 的关系示例&#xff1a;MSI 在 ARM GIC 的实际应用总结 PCIe Message 与 MSI 本文将介绍 PCIe message 的作用以及message 与 MSI 的关系&#xff0c;再介绍 MSI 如何配置以及…

每天40分玩转Django:Django类视图

Django类视图 一、知识要点概览表 类别知识点掌握程度要求基础视图View、TemplateView、RedirectView深入理解通用显示视图ListView、DetailView熟练应用通用编辑视图CreateView、UpdateView、DeleteView熟练应用Mixin机制ContextMixin、LoginRequiredMixin理解原理视图配置U…

IndexOf Apache Web For Liunx索引服务器部署及应用

Apache HTTP Server 是一款广泛使用的开源网页服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等 IndexOf 功能通常指的是在一个目录中自动生成一个索引页面的能力,这个页面会列出该目录下所有的文件和子目录。比如网上经常看到的下图展现的效果,那么接下来我们就讲一下…

C++的第一个程序

前言 在学习c之前&#xff0c;你一定还记得c语言的第一个程序 当时刚刚开始进行语言学习 因此告诉到&#xff0c;仅仅需要记住就可以 #include <stdio.h>int main(){printf("Hello World");return 0; }而对于c中的第一个程序&#xff0c;似乎有所变化 C的…

ipad如何直连主机(Moonlight Sunshine)

Windows 被连接主机&#xff08;Windows&#xff09; 要使用的话需要固定ip&#xff0c;不然ip会换来换去&#xff0c;固定ip方法本人博客有记载Github下载Sunshine Sunshine下载地址除了安装路径需要改一下&#xff0c;其他一路点安装完成后会打开Sunshine的Web UI&#xff…

mac docker部署jar包流程

mac docker部署jar包流程 默认服务器已经准备好了相关的准备工作&#xff0c;如&#xff1a;docker&#xff0c;docker内安装所需软件数据库&#xff0c;jdk等&#xff0c;将要部署等jar包。 1:将jar 包上传到服务器目录下&#xff1a;/usr/local/service (没有目录可以自己创建…

Qt -初识

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4da; 前言&#x1f6e0;️ 搭建环境&#x1f4c2; 新建项目&#x1f4dd; 初始代码理解main.cppwidget.hwidget.cppwidget.uiHelloWorld.pro&#x1f6e…

2024.12.30(多点通信)

作业&#xff1a; 1、将广播发送和接收端实现一遍&#xff0c;完成一个发送端发送信息&#xff0c;对应多个接收端接收信息实验。 发送端 #include <myhead.h>#define PORT 8888 #define IP "192.168.124.255"int main(int argc, const char *argv[]) {//1、…

点进CSS选择器

CSS 1.直接在标签的style属性进行设置(行内式) //写在数据单元格td标签内的stytle&#xff0c;设置color颜色和font-size字体大小&#xff1b; <td rowspan"3" style"color: red;font-size: 12px;">Web技术与应用</td> 2.写在head标签中的…

UE5材质节点BumpOffset

BumpOffset 凹凸偏移&#xff0c;可以让材质显示视差偏移的效果 Coordinate是UV&#xff0c;Height是凹凸偏移高度&#xff0c;HeightRatioInput用来控制高度比

仙盟系统开发——启动app失败

var 返回 仙盟使者.Cyber_CallApp(VOAPP, 命令, 携带);

LabVIEW声波谐振管自动化测量系统

开发了一种基于LabVIEW的声波谐振管自动化测量系统。该系统利用LabVIEW的强大功能&#xff0c;实现了对声波谐振频率的精确测量&#xff0c;提高了实验数据的采集效率和准确性。系统主要应用于物理教学和科研中&#xff0c;用于研究声波在谐振管中的传播特性。 项目背景 传统的…

学习笔记:使用 pandas 和 Seaborn 绘制柱状图

学习笔记&#xff1a;使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时&#xff0c;遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结&#xff0c;以便之后的项目中可以快…

【Linux】进程间通信-> 共享内存

共享内存原理 在C语言/C中&#xff0c;malloc也可以在物理内存申请空间&#xff0c;将申请的物理内存空间通过页表映射到进程地址空间&#xff0c;将内存空间的起始地址&#xff08;虚拟地址&#xff09;返回&#xff0c;进而进程可以使用虚拟地址通过页表映射到物理内存的方式…

【yolov5】实现FPS游戏人物检测,并定位到矩形框上中部分,实现自瞄

介绍 本人机器学习小白&#xff0c;通过语言大模型百度进行搜索&#xff0c;磕磕绊绊的实现了初步效果&#xff0c;能有一些锁头效果&#xff0c;但识别速度不是非常快&#xff0c;且没有做敌友区分&#xff0c;效果不是非常的理想&#xff0c;但在4399小游戏中爽一下还是可以…

【Maven】Maven打包机制详解

Maven打包的类型&#xff1f; 以下是几种常见的打包形式&#xff1a; 1、jar (Java Archive) 用途&#xff1a;用于包含 Java 类文件和其他资源&#xff08;如属性文件、配置文件等&#xff09;的库项目。特点&#xff1a; 可以被其他项目作为依赖引用。适合创建独立的应用程…

MySQLOCP考试过了,题库很稳,经验分享。

前几天&#xff0c;本人参加了Oracle认证 MySQLOCP工程师认证考试 &#xff0c;先说下考这个证书的初衷&#xff1a; 1、首先本人是从事数据库运维的&#xff0c;今年开始单位逐步要求DBA持证上岗。 2、本人的工作是涉及数据库维护&#xff0c;对这块的内容比较熟悉&#xff…

MySQL数据导出导出的三种办法(1316)

数据导入导出 基本概述 目前常用的有3中数据导入与导出方法&#xff1a; 使用mysqldump工具&#xff1a; 优点&#xff1a; 简单易用&#xff0c;只需一条命令即可完成数据导出。可以导出表结构和数据&#xff0c;方便完整备份。支持过滤条件&#xff0c;可以选择导出部分数据…

Go 协程池 Gopool VS ants 原理解析

写过高并发的都知道&#xff0c;控制协程数量是问题的关键&#xff0c;如何高效利用协程&#xff0c;本文将介绍gopool和ants两个广泛应用的协程池&#xff0c;通过本文你可以了解到&#xff1a; 1. 实现原理 2. 使用方法 3. 区别 背景 虽然通过go func()即可轻量级实现并发&…