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 功能通常指的是在一个目录中自动生成一个索引页面的能力,这个页面会列出该目录下所有的文件和子目录。比如网上经常看到的下图展现的效果,那么接下来我们就讲一下…

Nginx之Rewrite功能配置

一、Rewrite功能配置介绍 Rewrite是Nginx服务器提供的一个重要基本功能&#xff0c;是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持&#xff0c;因此在编译安装Nginx服务器之前&#xff0c;需要安装…

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 (没有目录可以自己创建…

机器算法之逻辑回归(Logistic Regression)详解

一、什么是逻辑回归&#xff1f; 逻辑回归并不是传统意义上的回归分析&#xff0c;而是一种用于处理二分类问题的线性模型。它通过计算样本属于某一类别的概率来进行分类&#xff0c;尽管名字中有“回归”二字&#xff0c;但它实际上是一种分类算法。简单来说&#xff0c;逻辑…

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、…

MySQL什么情况下会加间隙锁?

目录 一、使用范围条件查询 二、唯一索引的范围查询 三、普通索引的查询 四、间隙锁的锁定规则 五、间隙锁的影响 间隙锁(Gap Lock)是MySQL中的一种锁机制,主要用于防止幻读现象。在MySQL的InnoDB存储引擎中,当事务隔离级别设置为可重复读(Repeatable Read)时,间隙…

点进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用来控制高度比

24.小R的随机播放顺序<字节青训营-中等题>

1.题目 问题描述 小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌&#xff0c;播放后将其从歌单中移除。如果歌单中还有歌曲&#xff0c;则会将当前第一首歌移到最后一首。这个过程会一直重复&#xff0c;直到歌单中没有任何歌曲。 例如&#xff0c;给定歌单 [5, …

ZCC40036 过压保护芯片

功能描述&#xff1a; ZCC40036 是一款过压保护电路&#xff0c;通常用在热插拔电源接口&#xff0c;当输入电压异常高压时关闭输出&#xff0c;保护后级电路免受高压侵害。特有的延时上电功能&#xff0c;还可用在热插拔防打火电路中&#xff0c;电源接通后 ZCC40036 延时。接…

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

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

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

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

word怎么添加链接,点击直接到参考文献

word怎么添加链接,点击直接到参考文献 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 在Word中添加点击可直接跳转到参考文献的链接,主要有以下两种方法: 使用交叉引用和超链接结合的方法 插入参考文献: 首先,在文档中需要插入参考…

UniApp 打开文件工具,获取文件类型,判断文件类型

注意&#xff1a;以下代码使用 typeScript 开发&#xff0c;如果想在 js 中使用&#xff0c;可参考 npm 已经发布的包&#xff1a;https://www.npmjs.com/package/uni-easy-file NPM 使用 如果想直接在 npm 项目中使用可以直接执行以下命令 npm i uni-easy-file然后直接使用 …