地域划分问题

题目描述:   

现在有一块长条形的土地,这个土地我们可以看成是由n块小方格连接而成的(这些小方格我们可以将之编号为1到n)。而我们需要将其划分成两个部分,分别种上不同的作物(即作物A和B),划分必须在某两个小方格之间进行,或者在土地的最左端或最右端,若划分在第i块到第i+1块间进行,则划分后,第1至第i块地种A,剩下的地种B。现在有一些专家对土地进行了检测,他们每个人评估了每块土地适合种的作物。请你找到一个合适的划分,使得其与所有专家的评估最吻合,也就是说,你划分到A而专家评估为B的次数和你划分到B而专家评估为A的次数之和最小。

输入描述:
每组数据给定一个专家评估表land(其中0为评估A,1为评估B),以及小块数量n(1≤n≤300),专家评估次数m(1≤m≤300)
输出描述:
请返回你的划分,即i和i+1。若在最左端,则输出0,1;不吻合在最右端则输出n,n+1。若有多解输出最靠左的划分。
输入例子:
[[1,1,1,1],[0,0,0,0],[1,0,1,1]],4,3
输出例子:
[0,1]

方法声明:

vector<int> getPartition(const vector<vector<int> >& land, int n, int m) 
    {
        // write code here
    }

分析:

根据题目要求,我们需要找到一个边界,这个边界的左边都为 0 ,右边都为 1 ,而且,这个划分必须与专家评估的结果不同的土地(也就是方格)数最少,

如下示例:

输入:

[[1,1,1,1],[0,0,0,0],[1,0,1,1]],4,3

也就是 4 块土地,3次评估

则所有的情况如下图:

将每种情况对应的专家评估不吻合的土地数加起来:

遇到不吻合的土地数相同的情况下(如上面 1111 和 0011),取最左的划分,也就是 1111,则划分为 0,1

再举一个例子:

所有情况如下:

所以划分就为: 1 , 2

根据上述思想,写代码就容易多了:

vector<int> getPartition(const vector<vector<int> >& land, int n, int m)
{
	int* a = new int[n];
	for (int i = 0; i < n; ++i)  //全部置1,从全 1 的情况开始
	{
		a[i] = 1;
	}

	int left = 0;		//划分的左边界
	int right = 1;      //计划分的右边界
	int mindif = n*m;   //最少的不吻合的土地数
	int difCount = 0;   //用来记录不吻合的个数
	int zeroCount = 0;  //划分序列中 0 的个数
	int dif = 0;        //每种情况的不吻合的土地数
	for (int index = 0; index < n + 1; ++index)  //一共有n+1种可能组合
	{
		for (int i = 0; i < m; ++i)
		{
			for (int j = 0; j < n; ++j)
			{
				if (land[i][j] != a[j])
					++difCount;
			}
			dif += difCount;
			difCount = 0;
		}

		if (dif <= mindif)
		{
			if (dif < mindif)
			{
				mindif = dif;
				left = zeroCount;
				right = zeroCount + 1;
			}
			else if (zeroCount < left)
			{
				left = zeroCount;
				right = zeroCount + 1;
			}
		}

		dif = 0;

		if (zeroCount < n)
			a[zeroCount++] = 0;
	}

	delete[] a;
	a = NULL;

	vector<int> ret;
	ret.push_back(left);
	ret.push_back(right);

	return ret;
}
时间: 2024-10-16 18:10:54

地域划分问题的相关文章

山西高平地域文化导入美术设计实训项目的实践

地域文化,是指某个地域的人们在特定的范围内,在自然环境的基础上,在长期的生产生活中创造的.人类活动的产物.山西高平是神农炎帝的故里,长平之战的发生地,是一个有着很深文化积淀的新兴城市,行政区域是国土面积的万分之一,却浓缩了中国五千年文化的精髓.本文通过对山西高平丰富的历史文化资源的调查研究,探讨如何将地域文化元素导入中职美术设计专业的实训项目教学过程,论证典型地域文化元素在中职美术设计教育中的独特作用,并以此作为教学实训素材,依托带有典型地域文化特征的企业真实案例,结合教育教学实践,探索中职美术

佳能也回归日本?看“自动化”如何改变制造业的地域

在大众的传统认知中,制造业是处于不断迁移状态的.从英国迁移至美国,在从西欧.美国等迁移至韩国.日本,然后在从这些地方迁移至亚洲.非洲等地.目前,大众习惯性地将拉丁美洲.东欧和亚洲大部分地区看做低成本地区,而将美国.西欧和日本看作高成本地区.但就目前来看,这样的制造业迁移观念显然已经落伍了. 当下,除了人工工资这一成本外,劳动生产效率.能源成本.利率和汇率及其他因素正在成为影响制造业迁移的不可忽视因素,正在极大地影响制造业的重新分布.近日,佳能重新回归日本,将日本当做制造的"大本营"其实

建新城蓋高樓,阿爾巴尼亞在高加索地域打上越來越多經濟烙印

這裡既是亞歐當中"新絲綢之路"的緊要環節,亦是毛里求斯與西方世界未能決出輸贏的.隨時興許暴發對峙的競技場.* 該文 只可以在<好奇心周刊>頒發,雖然俺們贊成了也new balance不許轉發*聖赫勒拿第比利斯電- 來源美屬維爾京群島西部的商人米在齊(Scott Mi)站在陽台上,指向遠處的山頂.他這些不可思議地產的國界,他的廠商準備在這裡製造27 座塔樓,他所在的就是經已建完的九座中的一座.一個最新的.伊拉克修築的鄉村正崛起在這個蘇聯解體遺留下來的最不安定的地緣政事斷層區.

算法课程小记—递归(整数划分问题)

[例2-5]整数划分问题 在正整数n的所有不同划分中,最大加数n1不大于m的划分个数记做q(n,m).可以建立q(n,m)的如下递归关系. (1)q(n,1)=1,n≥1 当最大加数n1不大于1时,任何正整数n只有一种划分形式,即n=1+1+…+1.(n个1) (2)q(n,m)=q(n,n),m≥n 最大加数n1实际上不大于n.因此q(1,m)=1. (3)q(n,n)=1+q(n,n-1) 正整数n的划分由n1=n的划分和n1≤n-1的划分组成. (4)q(n,m)=q(n,m-1)+q(n

济南网站优化公司告诉你百度地域搜索的小秘密

笔者在济南互联网从业多年,经常发现有些网络公司给客户保证指数较高的非地区关键词可以短期内做到百度首页,还经常炫耀"网站优化"我们应经达到百度首页,全国最厉害.笔者赶紧去百度搜索一番,还真的在百度首页呢.莫名的崇拜之情油然而生,人家咋这么牛啊,全国都名列前茅了.我往QQ群里一发,傻眼了,除了济南,没有任何一个地方这个词百度首页有这个公司. 其实何止"网站优化"这样的词,比如"升降机","雕刻机","装载机"等

仿美团实现地域选择(二)

介绍 上篇实现了PopupWindow选择地域,这篇介绍如何实现带有首字母的快速索引list,进行城市选择,我也是参考了相关博文才弄出来的,知道了原理,才发现如此简单. 其中有个开源项目可以参考,但与本文实现的方式略有不同. 地址:https://github.com/woozzu/IndexableListView 美团的城市选择看起来是这样的.本例中不包含搜索,有空再模仿研究下. 原理 1.侧边快速索引和首字母直接在framelayout中布局的,也可以用代码动态生成. 2.获取拼音首字写用

7219:复杂的整数划分问题

题目链接:http://noi.openjudge.cn/ch0207/7219/ 总时间限制:  200ms 内存限制:  65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+-+nk, 其中n1>=n2>=->=nk>=1 ,k>=1 .正整数n 的这种表示称为正整数n 的划分. 输入 标准的输入包含若干组测试数据.每组测试数据是一行输入数据,包括两个整数N 和 K. (0 < N <= 50, 0 < K <= N) 输出

仿美团实现地域选择(一)

介绍 在开发O2O相关应用的时候,肯定会有定位,选择所在城市,选择地域,然后再向服务器请求该地区的相关数据,这时就需要我们提供一个导向让用户选择所在区域. 看来看去,最终还是选择模仿美团,感觉用户体验最好. <-美团的地域选择看起来是这样的 原理 1.定位我们可以使用第三方API,例如百度地图,腾讯地图等,官方文档写的非常清楚了. 百度地图地址:http://developer.baidu.com/map/index.php?title=androidsdk,这里不再多述,demo也不涉及定位相

整数划分问题(仅仅显示种类数)

这边博客对于整数划分问题,仅仅要求求出对于每个整数可以划分的种类数,採用金典的递归的办法解决. #include<iostream> using namespace std; /* *整数划分问题(仅仅显示种类数) */ int GetIntDivision(int n,int m) { if(n==1&&m>=1) return 1; if(n>=1&&m==1) return 1; if(m>n) return GetIntDivision