CF448C Painting Fence (贪心分治)
题面


\(solution:\)
一道蛮水的分治题,但思想很不错(虽然我还是非常天真的以为是积木大赛原题,并且居然还有30分)
看到这个题目,根据贪心的一贯风格,我们肯定能想到将整个栅栏的下面某部分直接用几次横向的操作把它涂掉。然后我们发现如果将涂了色的部分不管,整段栅栏会被我们分成若干个部分(最短的竖条栅栏因为贪心会被横着涂完,然后整个栅栏会被分为左(中)右几个部分)。然后我们将这几个依次用这种办法分治。再然后我们发现我们好像把纵向操作忘记了,它在什么地方用呢?我们在每一次求某段栅栏最小次数时比较一下:将它全部纵向涂色用的步数少还是横纵结合的步数少(这段栅栏被分治时某一部分被全部用了纵向操作)。
然后我们的边界条件就是当某一段栅栏被分得只有一条的时候,直接纵向刷一次即可!
\(code:\)
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
int n;
int a[5005];
inline int qr(){
	char ch;
	while((ch=getchar())<'0'||ch>'9');
	int res=ch^48;
	while((ch=getchar())>='0'&&ch<='9')
		res=res*10+(ch^48);
	return res;
}
inline int fen(int l,int r,int h){
	if(l>r)return 0;//特判
	if(l==r)return 1;//边界
	int tot=0,mi=inf;
	for(rg i=l;i<=r;++i)
		mi=min(mi,a[i]);//贪心的找能横向涂多少次
	for(rg i=l,j;i<=r;i=j+1){
		for(j=i;j<=r;++j)
			if(a[j]==mi)break;
		tot+=fen(i,j-1,mi);
	}return min(r-l+1,tot+(mi-h));//横纵比较
}
int main(){
	freopen("color.in","r",stdin);
	freopen("color.out","w",stdout);
	n=qr();
	for(rg i=1;i<=n;++i)a[i]=qr();
	printf("%d\n",fen(1,n,0));
	return 0;
}
												
											CF448C Painting Fence (贪心分治)的更多相关文章
- CF448C Painting Fence (分治递归)
		
Codeforces Round #256 (Div. 2) C C. Painting Fence time limit per test 1 second memory limit per tes ...
 - CF448C [Painting Fence]递归分治
		
题目链接:http://codeforces.com/problemset/problem/448/C 题目大意:用宽度为1的刷子刷墙,墙是一长条一长条并在一起的.梳子可以一横或一竖一刷到底.求刷完整 ...
 - CF-448C Painting Fence 分治
		
Painting fence 题意 乍一看以为是之前做过的一道单调队列优化的DP,不是. 也是有n块木板,每个木板宽1米,有一个高度ai,现在要把他们刷成橘色,给了你一个宽一米的刷子,你可以横着刷,或 ...
 - Codeforces Round #256 (Div. 2) C. Painting Fence(分治贪心)
		
题目链接:http://codeforces.com/problemset/problem/448/C C. Painting Fence time limit per test 1 second m ...
 - Codeforces 448C Painting Fence:分治
		
题目链接:http://codeforces.com/problemset/problem/448/C 题意: 有n个木板竖着插成一排栅栏,第i块木板高度为a[i]. 你现在要将栅栏上所有地方刷上油漆 ...
 - 448C - Painting Fence(分治)
		
题意:给出宽为1高为Ai的木板n条,排成一排,每次上色只能是连续的横或竖并且宽度为1,问最少刷多少次可以使这些木板都上上色 分析:刷的第一步要么是所有的都竖着涂完,要么是先横着把最矮的涂完,如果是第一 ...
 - CF448C Painting Fence
		
传送门 Descriptionzed 最近总是受到 Farmer 的困扰,因此他在自家的门前插了一排栅栏以防农气的入侵.栅栏由 N 个竖条栅栏横向组成,每个竖条栅栏宽度为 1.过了一段时间,zed 觉 ...
 - codeforces  256 div2 C. Painting Fence 分治
		
C. Painting Fence time limit per test 1 second memory limit per test 512 megabytes input standard in ...
 - 【题解】Painting Fence
		
[题解]Painting Fence 分治模板.贪心加分治.直接\(O(n^2logn)\)分治过去.考虑一块联通的柱形是子问题的,是递归的,贪心分治就可.记得对\(r-l+1\)取\(min\). ...
 
随机推荐
- 国产首款5G手机抢先亮相:如此给力的说!
			
5G网络是接下来移动互联网发展的主旋律,各家都在努力跟进,目前最积极的当属手机厂商,而2019年我们就能看到多款5G手机降临了. 在11月27日的未来信息通信技术国际研讨会上,vivo展示了他们正在研 ...
 - Django-website 程序案例系列-7 创建多对多关系表
			
创建多对多关系表: 方式一:一共三张表其中有一张中间表需要手工建立(建议使用第一种方式自定制程度高) class Host(models.Model): hostname = models.CharF ...
 - NOIP 2018 游记(退役了!)
			
一片空白 在霉的不能再霉的18年11月,Noip2018上,倒霉的我也是贼有意思,感冒加身,D2发烧,数组开小…我还能说什么MMP,身体和考试能力真的很重要. ……(省略无数字的心理活动,有空补上~) ...
 - BAI度 内部资料!Python_Threads多线程
			
基本介绍 runable运行sleeping等待dead销毁(run方法执行完成或执行时抛出异常) 类继承threading.Thread线程的状态 函数介绍 在__init__里调用threadin ...
 - Dependency Walker使用说明[转]
			
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 初窥门径:Windows的基石 随便打开一个系统目录, ...
 - 自学Python2.1-基本数据类型-字符串str(object) 上
			
自学Python之路 自学Python2.1-基本数据类型-字符串str(object) 上 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串 ...
 - BZOJ 4212: 神牛的养成计划
			
4212: 神牛的养成计划 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 142 Solved: 30[Submit][Status][Discus ...
 - 【Luogu4921】情侣?给我烧了!(组合计数)
			
[Luogu4921]情侣?给我烧了!(组合计数) 题面 洛谷 题解 很有意思的一道题目. 直接容斥?怎么样都要一个平方复杂度了. 既然是恰好\(k\)对,那么我们直接来做: 首先枚举\(k\)对人出 ...
 - 【BZOJ1826】[JSOI2010]缓存交换(贪心)
			
[BZOJ1826][JSOI2010]缓存交换(贪心) 题面 BZOJ 洛谷 题解 当缓存不满显然直接放进去,满了之后考虑拿走哪一个.不难发现拿走下一次出现时间最晚的那个一定不会更差. 那么用一个堆 ...
 - emwin之2D图形绘制问题
			
@2018-09-03 [问题] 在 WM_PAINT 消息分支里绘制2D图形可以正常显示,而在外部函数或按钮按下事件的响应消息分支下等处,绘制2D图形则不显示. [解决] 在除消息WM_PAINT分 ...