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

news2025/1/2 23:50:08

1.圆排列

问题描述

GXUOJ | 圆排列

代码解答

#include<bits/stdc++.h>

using namespace std;

int n;
int r[1000];
double x[1000];
double ans = 0x3f3f3f3f;

double calculate(){
	memset(x, 0, sizeof x);
	for(int i = 0; i < n; i++){
		for(int j = 0; j < i; j++)
			x[i] = max(x[i], x[j] + sqrt(4*r[i]*r[j]));
	}
	double low = 0x3f3f3f3f, high = - 0x3f3f3f3f;
	for(int i = 0; i < n; i++){
		low = min(low, x[i] - r[i]);
		high = max(high, x[i] + r[i]);
	}
	return high - low;
}

int main(){
	cin >> n;
	for(int i = 0; i < n; i++)
		cin >> r[i];
	do{
		ans = min(ans, calculate());
	}while(next_permutation(r, r + n));
	printf("%.2lf", floor(ans * 100)/100);
}

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

圆排列问题详解(原理+代码)_对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]*m
            if (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 或 1
        for (int i = 0; i < 2; i++) { 
            // 在符号三角形第一行的第 t 个位置放置 i
            p[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.coloradmin.cn/o/2268774.html

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

相关文章

[创业之路-225]:《华为闭环战略管理》-4-华为的商业智慧:在价值链中探索取舍之道与企业边界

目录 一、在价值链中探索取舍之道与企业边界 价值链的深刻洞察 取舍之道&#xff1a;有所为&#xff0c;有所不为 垂直整合与横向整合的平衡 企业边界与活动边界的界定 采购与外包的智慧运用 结语 二、企业外部价值流&#xff1a;上游、中游、下游、终端 上游&#xf…

【从零开始入门unity游戏开发之——C#篇33】C#委托(`Delegate`)和事件(`event` )、事件与委托的区别、Invoke()的解释

文章目录 一、委托&#xff08;Delegate&#xff09;1、什么是委托&#xff1f;2、委托的基本语法3、定义自定义委托4、如何使用自定义委托5、多播委托6、C# 中的系统委托7、GetInvocationList 获取多个函数返回值8、总结 二、事件&#xff08;event &#xff09;1、事件是什么…

大模型—Ollama 结构化输出

Ollama 结构化输出 Ollama现在支持结构化输出,使得可以按照由JSON模式定义的特定格式来约束模型的输出。Ollama的Python和JavaScript库已经更新,以支持结构化输出。 结构化输出的用例包括: 从文档中解析数据从图像中提取数据结构化所有语言模型响应比JSON模式更可靠和一致开…

【Python】selenium 获取滑块和背景图在电脑屏幕的相对位置【解决滑块验证码问题】

在使用python模拟爬取的时候&#xff0c;解决滑动验证码是不可缺少的环节。怎么解决滑动验证码的问题呢&#xff0c;我们可以试着使用这样的方法&#xff1a; 我们在解决滑块验证码问题的时候&#xff0c;首先要找到滑块和在网页上的位置&#xff0c;定位好位置以后&#xff0…

微信小程序:定义页面标题,动态设置页面标题,json

1、常规设置页面标题 正常微信小程序中&#xff0c;设置页面标题再json页面中进行设置&#xff0c;例如 {"usingComponents": {},"navigationBarTitleText": "标题","navigationBarBackgroundColor": "#78b7f7","navi…

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的发展&#xff0c;在现在&#xff0c;编程技术的IDE里面也融合了AI的基本操做。本例&#xff0c;以微软的Visual Studio中的人工智能的功能介绍例子。 本例的环境&#xff1a; Visual Studio 17.12 1 AI 智能变量检测&#xff1a; 上图展示了一…

后端开发-Maven

环境说明&#xff1a; windows系统&#xff1a;11版本 idea版本&#xff1a;2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型&#xff08;POM&#xff09;&#xff0c;通过一组构建规则和约定来管理项目的构建&#xf…

BAPI_BATCH_CHANGE在更新后不自动更新批次特征

1、问题介绍 在CL03中看到分类特性配置了制造日期字段&#xff0c;并绑定了生产日期字段MCH1~HSDAT MSC2N修改批次的生产日期字段时&#xff0c;自动修改了对应的批次特性 但是通过BAPI&#xff1a;BAPI_BATCH_CHANGE修改生产日期时&#xff0c;并没有更新到批次特性中 2、BAPI…

ARM200~500部署

前提&#xff1a;数据库已经安装好&#xff0c;并且正常运行 1.修改hostname,将里面的AR-A 改为hzx vi /etc/hostname 2.重启网络服务 sudo systemctl restart NetworkManager 3.修改community-admin.service 文件&#xff0c;更改小区名称和IP&#xff0c;并将文件上传到/…

修改secure-file-priv参数-mysql5.7.26限制不允许导入或导出的解决方法

文章目录 前言secure_file_priv参数说明修改secure_file_priv参数的步骤 前言 本人是在sql注入的文件上传拿web shel 时所用到的写入文件权限遇到文件上传不成功的问题&#xff0c;记住修改后&#xff0c;重启mysql才生效&#xff0c;最后可以查看验证一下。 secure_file_priv…

Java编程规约:日期时间

文章目录 I 日期时间编程规约【强制】【推荐】II 知识扩展日期格式I 日期时间编程规约 【强制】 日期格式化时,传入 pattern 中表示年份统一使用小写的 y。说明:日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后引入的概念), 意…

Java [后端] 开发日常记录(1)

目录 1、常用的注解 2、对字符串的处理 3、对JSON串的处理 -- The End -- 详细如下&#xff1a; 1、常用的注解 若返回的字段中有NUll&#xff0c;则不返回 JsonInclude(value JsonInclude.Include.NON_NULL) //在实体类中添加这个注解 JsonInclude(JsonInclude.Include.NON…

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

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

2024/12/29 黄冈师范学院计算机学院网络工程《路由期末复习作业一》

一、选择题 1.某公司为其一些远程小站点预留了网段 172.29.100.0/26&#xff0c;每一个站点有10个IP设备接到网络&#xff0c;下面那个VLSM掩码能够为该需求提供最小数量的主机数目 &#xff08; &#xff09; A./27 B./28 C./29 D./30 -首先审题我们需要搞清楚站点与网…

el-table动态行和列及多级表头

主页面 <template><div class"result-wrapper"><dynamic-table :table-data"tableData" :table-header"tableConfig" :tableTitle"tableTitle" :flowParams"flowParams"></dynamic-table></div…

✨✨vue3自定义动态不同UI组件筛选框案例✨

✨1. 实现功能 &#x1f31f;添加条件进行数据筛选 根据筛选数据条件不同&#xff0c;显示不同的UI组件&#xff1a;包含datetime、select、input等筛选完条件可继续添加与取消条件当然可以在条件列表中进行直接删除&#xff0c;当删除完所有条件之后&#xff0c;回到添加条件…

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试&#xff1f; 速度&#xff1a;Go速度很快&#xff0c;这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性&#xff1a;可以利用Go的内置并发性(goroutines)来并行化测试执行 简单&#xff1a;Go的简约语法允许您编写可读且可维护…

总结TCP/IP四层模型

总结TCP/IP四层模型 阅读目录(Content) 一、TCP/IP参考模型概述 1.1、TCP/IP参考模型的层次结构二、TCP/IP四层功能概述 2.1、主机到网络层  2.2、网络互连层  2.3、传输层  2.3、应用层 三、TCP/IP报文格式 3.1、IP报文格式3.2、TCP数据段格式3.3、UDP数据段格式3.4、套…

怎么在家访问公司服务器?

在日常工作中&#xff0c;特别是对信息技术从业者而言&#xff0c;工作往往离不开公司的服务器。他们需要定期访问服务器&#xff0c;获取一些关键的机密文件或数据。如果您在家办公&#xff0c;并且需要处理未完成的任务&#xff0c;同时需要从公司服务器获取所需的数据&#…

自动化文档处理:Azure AI Document Intelligence

Azure AI Document Intelligence支持多种文件格式&#xff0c;包括PDF、JPEG、PNG等。其核心功能是将这些文档按页进行内容提取&#xff0c;并转化为LangChain文档。其默认输出格式是Markdown&#xff0c;这使得文档可以通过MarkdownHeaderTextSplitter进行语义分片。您也可以使…