首页 > 其他 > 详细

codeforces 448C 搜索

时间:2014-08-09 11:12:28      阅读:350      评论:0      收藏:0      [点我收藏+]

题意:给你n条1个宽度ai长度的木条,有一个刷子可以一次刷宽度为1长度无限,问你用最少的次数把所有木条都刷满。

思路:我们可以用分治的思想来做,首先找到n条木条最短的木条i,然后减去它的值,再查找,1到i-1,和i+1到n的最小值,由于可以竖着刷,因此要比较

刷完这段区间的横着刷和竖着刷的最小值。最终即为答案。

#include <stdio.h>
#include<string.h>
const int maxn = 5009;
const int inf = 1<<29;

inline int min(int a,int b){return a < b ? a : b;}
int a[maxn];

int  DFS(int l,int r)
{
	int i,mina = inf;
	int sum = 0;
	for(i = l;i <= r; i++)
		mina = min(mina,a[i]);
	for(i = l;i <= r; i++)
		a[i] -= mina;
	sum = mina;
	int ll = l;
	for(i = l;i <= r; i++)
	{
		if(a[i] == 0)
		{
			sum += DFS(ll,i-1);
			ll = i+1;
		}
	}
	if(ll <= r) sum += DFS(ll,r);
	return min(sum,r-l+1);
}

int main()
{
	int n,i;
	while(~scanf("%d",&n))
	{
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		printf("%d\n",DFS(0,n-1));
	}
	return 0;
}

 

codeforces 448C 搜索,布布扣,bubuko.com

codeforces 448C 搜索

原文:http://www.cnblogs.com/BruceNoOne/p/3900591.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!