土地划分

现有一块长方形土地,可看成n个小方块组成,这n个小方块依次编号为1-n,现要在这块土地上种A、B两种庄稼,需将该快土地划分成两大块,如果划分结果在第i块和第i+1块之间,则输出{i,i+1},i可以取0或n,这种情况说明有一种庄稼没有种。

专家经过m次鉴定,确定哪个小块适合种那种庄稼,每次鉴定,如果适合种Ai+1庄稼标记为1,适合种B庄稼标记为0,现设计一程序,确定土地划分,使得你划分的土地的小方块和专家鉴定的结果的小方块不一致的个数最少,如果有多解,则取i最大的那个(即右边划分的最少的情况)

例如:

//有4个小方块,专家鉴定了3次

输入{{1,1,1,1},{0,0,0,0},{1,0,1,1}},4,3

输出{0,1}

代码实现:

Land.h

#pragma once
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;

class Partition {
public:
	 vector<int> getPartition(const vector<vector<int> >& land, int n, int m) 
	 {
		int count = pow(2, n) - 1;//可能划分的情况共有count种
		int i = 0, j = 0;

		int dstres = n*m;
		int lessCount = 0;
		while (count >= 0){
			int flag = 0;
			int k = 1;
			int tmp = count;
			while (count > 1){
				int ret = (tmp >> 0) & 0x01;
				while (k < n){
					if (ret != ((tmp >> k) & 0x01)){
						flag++;
						if (flag == 2){
							count--;
							break;
						}
						ret = (tmp >> k) & 0x01;
					}
					k++;
				}
				if (flag != 2)
					break;
				k=1;
			}
			int res = 0;
			while (i<m){
				int sum = 0;
				while (j<n){
					sum = sum << 1;
					sum += land[i][j];
					j++;
				}
				sum = sum ^ count;
				//统计sum转换成二进制后1的个数
				while (sum){
					res += sum % 2;
					sum /= 2;
				}
				i++;
				j = 0;
			}
			if (res<dstres){
				dstres = res;//最少的次数
				lessCount = count;
			}
			i = 0;
			count--;
		}
		count = lessCount;
		int ret = 0;

		int bit = count & 0x01;
		while (count>0 && ((count & 0x01) == bit))
		{
			count = count >> 1;
			ret++;
		}

		vector<int> a = { n-ret,n-ret+1 };
		return a;
	}
};

Test.cpp

#include"Land.h"
using namespace std;

void Test()
{
	Partition a;
	int n = 4;
	int m = 3;
	//int n = 3;
	//int m = 4;
	vector<vector<int> > land = { { 1, 1, 1, 1 }, { 0, 0, 0, 0, }, {1, 0, 1, 1} };
	//vector<vector<int> > land = { { 1, 1, 0 }, { 0, 0, 0 }, { 1, 0, 1 }, {1, 0, 0} };
	vector<int> array = a.getPartition(land, n, m);
	printf("{%d,%d}\n", array[0], array[1]);
}

int main()
{
	Test();

	system("pause");
	return 0;
}

运行结果:

输入为

{ { 1, 1, 1, 1 }, { 0, 0, 0, 0, }, {1, 0, 1, 1} }  n=4  m=3

输出为

====================================================================

输入为

{ { 1, 1, 0 }, { 0, 0, 0 }, { 1, 0, 1 }, {1, 0, 0} }   n=3  m=4

输出为

时间: 2024-10-06 23:47:43

土地划分的相关文章

fzu 1015 土地划分(判断线段相交+求出交点+找规律)

链接:http://acm.fzu.edu.cn/problem.php?pid=1015  Problem 1015 土地划分 Accept: 714    Submit: 1675Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 在Dukeswood这块土地上生活着一个富有的农庄主和他的几个孩子.在他临终时,他想把他的土地分给他的孩子.他有许多农场,每个农场都是一块矩形土地.他在农场地图上划上一些直线将

[51nod2953] 土地划分

问题描述 Y国有N座城市,并且有M条双向公路将这些城市连接起来,并且任意两个城市至少有一条路径可以互达. Y国的国王去世之后,他的两个儿子A和B都想成为新的国王,但他们都想让这个国家更加安定,不会用武力解决问题. 于是他们想将这个国家分成两个小国家A国和B国.现在,A拥有1号城市,B拥有N号城市,其他的城市还尚未确定归属哪边(划分之后的国家内部城市可以不连通). 由于大家都想让国家变得更好,而某些城市的人民愿意国王的A儿子作为他们的领袖,而某些城市更看好B,而为了交通的便捷,如果划分后的公路连接

题解 51nod2935 土地划分

题解 51nod2935 土地划分 题面 51nod 解析 一眼最小割考虑怎么建图. 从最简单的边连起:对于每个点 \(i\),连边 \((S,i,A_i)\),\((i,T,B_i)\), (\(S,T\) 分别为源,汇点) 然后考虑每条边 \((x,y)\)的问题, 如果两个点都划分给 \(A\),那在图上就是两个点到 \(T\) 的边都被割掉了, 因此我们新建一个点 \(z\) ,连边 \((x,z,\inf),(y,z,\inf),(z,T,EB_i)\) 即割掉都划分给 \(B\) 的

BZOJ 3511 土地划分

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3511 题目分析: 看上去和前面的人员雇佣以及小M种田都很像. 最小割模型来求最大值,一般都是考虑怎样构图使得满足一个组合能被表示出来,而且当满足一个组合的时候,能产生或失去所需的效益.[割掉的是不要的] 我们将s与1相连,连为INF,这样就不会被割,n向t连边,同理. 因为1和n会有边连接,所以我们才多建出了节点s,t. 然后对于每个点i,s向i连wa[i],i向t连wb[i],这样就满

BZOJ3511 土地划分 题解&amp;代码

pkusc发现自己不会费用流233333于是两天速成费用流[然而这是一道最小割(最大流QwQ 题意: 给出n个点m条边,并设定: 点x在被划分至集合A时获得权值A[x],否则即被划分至集合B并获得权值B[x]: 边(x,y)连接的x和y均属于集合A时获得权值ea,均属于集合B时获得权值eb,否则获得权值-ec. 题解:这题-反正我是没自己建出图来. 对于点x,从S(代表集合A)向x连容量为va的边,从x向T(代表集合B)连容量为vb的边. 对于边(x,y),从S向x和y分别连容量为ea/2的边,

FZU 1015 土地划分

  Description 在Dukeswood这块土地上生活着一个富有的农庄主和他的几个孩子.在他临终时,他想把他的土地分给他的孩子.他有许多农场,每个农场都是一块矩形土地.他在农场地图上划上一些直线将矩形分成若干块.当他划直线时,他总是从矩形边界上的某一点划到另一个矩形边界上的点,这条线的结束点将成为下一条线的起始点.他划线时从不会让任三线共点.例如图1是某一种划分结果. 图1 划分的起始点和结束点均以五角星标记.当他完成划分后,他想要数一下划出的土地的块数以确保每个孩子都有一块地.例如,图

hdu 1241 Oil Deposits

题意:用广度优先搜索 //c++写输入时有问题 1)这个是深搜 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> /* map数组是用来装字符的 n,m提高作用域,使訪问的权限变高 dir方便广度优先搜索,由于要搜索8个方向.这样做最方便 */ char map[101][101]; int n,m; int dir[8][2]={{-1,-1},{0,-

6、快速排序

一.分而治之 分而治之(divide and conquer,DnC)是一种解决问题的思路,它的核心就是利用递归函数,不断把一个问题变成越来越小的问题,直到出现解决条件为止的解题思路. 二.分而治之解题实例 1.问题:假如你是一个农场主,你有一块1680×680的土地,现要求你将土地划分成均匀的方块,且方块的面积尽可能大,现求出最大的方块边长. 分而治之:分而治之解决问题的过程包括两个步骤:①找到最简单的情况(基础条件):②不断缩小问题的规模. 分析:由于原土地是一个矩形,所以最简单的情况是,该

(经典DFS)HDU_1241 Oil Deposits

HDU_1241 Oil Deposits Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land i