UVA11212Editing aBook 编辑书稿

问题描述:你有一篇由n(n\in[2,9])个自然段组成的文章,希望将它们排列成1,2,、、、n。可以用Crtl+X和Ctrl+V快捷键来完成任务。每次可以剪一段连续的自然段,粘贴时按照顺序粘贴。注意,剪贴板只有一个,所以不能连续剪切两次,只能剪切和粘贴交替。

例如,为了将{2,4,1,5,3,6}变为升序,可以剪切1将其放到2前,然后剪切3将其放到4前,再如,对于排列{3,4,5,1,2},只需要剪切一次和粘贴一次即可——将{3,4,5}放在{1,2}后面或者{1,2}放在{3,4,5}前面。

分析:对于长度n为9时,最多移动8次即可,而实验得知长度为9,{9,8,7,6,5,4,3,2,1},最多移动5次。所以枚举移动上限为5。然后有一个最重要的剪枝,3d+h>3*maxd,d是目前移动的次数,也就是深度,而h是错误段落的个数,maxd是最大深度。可知每次移动最多会有3个段落次序发生改变,所以当错误段落个数大于剩余的移动次数*3的时候剪枝。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 100 + 5;
int a[maxn]; int n = 0;
int h() {
	int cnt = 0;
	for (int i = 0; i < n - 1; i++)if (a[i] +1!= a[i + 1])cnt++;
	if (a[n - 1] != n)cnt++;
	return cnt;
}
bool is_sorted() {
	for (int i = 0; i < n - 1; i++)if (a[i] >= a[i + 1])return false;
	return true;
}
bool dfs(int d,int maxd) {
	if (3 * d + h() > 3 * maxd)return false;
	if (is_sorted())return true;
	int old[maxn], b[maxn];
	memcpy(old, a, sizeof(a));
	for (int i = 0; i < n; i++) {
		for (int j = i; j < n; j++) {
			int cnt = 0;
			for (int k = 0; k < n; k++)
				if (k<i || k>j)b[cnt++] = a[k];//取出不移动的位置
			for (int k = 0; k < cnt; k++) {//枚举剩余可移动位置(不移动的元素个数)
				int cnt2 = 0;
				for (int p = 0; p < k; p++)a[cnt2++] = b[p];//移动到这个位置
				for (int p = i; p <= j; p++)a[cnt2++] = old[p];
				for (int p = k; p < cnt; p++)a[cnt2++] = b[p];
				if (dfs(d + 1, maxd))return true;
				memcpy(a, old, sizeof(a));//回溯要还原
			}
		}
	}
	return false;
}
int solve() {
	if (is_sorted())return 0;
	int max_ans = 5;
	for (int maxd = 1; maxd < max_ans; maxd++) {
		if (dfs(0, maxd))return maxd;
	}
	return max_ans;
}
int main() {
	int kase=0;
	while (cin >> n &&n) {
		int temp;
		for (int i = 0; i < n; i++) { cin >> a[i]; }
		cout << "Case " << ++kase << ": ";
		cout << solve() << endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`draw_geometries_with_editing`是Open3D中用于可视化和编辑几何图形的函数。它允许您通过鼠标和键盘控制图形的旋转、平移、缩放等操作,以及添加、删除、修改点云和三维模型中的点、线、面等元素。 在使用`draw_geometries_with_editing`函数时,您需要按照以下步骤进行编辑: 1. 创建一个要编辑的几何图形对象,例如点云或三维模型。 2. 将该对象添加到一个列表中,并调用`draw_geometries_with_editing`函数进行可视化和编辑。 3. 在可视化窗口中,您可以使用鼠标和键盘控制图形的旋转、平移、缩放等操作。 4. 您可以使用鼠标右键添加、删除、选择等操作。例如,按住鼠标右键并拖动可以选择多个点,按下删除键可以删除所选点。 5. 在编辑完成后,您可以按下键盘上的“Q”键退出编辑模式,并获取编辑后的几何图形对象。 以下是一个简单的示例代码,演示如何使用`draw_geometries_with_editing`函数对点云进行编辑: ```python import open3d as o3d # 创建点云 pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector([ [0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1] ]) # 添加到列表并进行可视化和编辑 o3d.visualization.draw_geometries_with_editing([pcd]) # 获取编辑后的点云对象 edited_pcd = o3d.geometry.PointCloud() edited_pcd.points = pcd.points ``` 在这个示例中,我们创建了一个简单的点云,并将其添加到一个列表中进行可视化和编辑。在可视化窗口中,您可以使用鼠标和键盘进行编辑操作。编辑完成后,您可以按下键盘上的“Q”键退出编辑模式,并获取编辑后的点云对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值