codeforces 460C - Present 二分加模拟

代码有详细解释,二分模拟寻找结果,贪心选择从哪开始浇花,原则就是遇到需要浇花的就浇,至于w可以用线段树来维护线段,但也可以用一个数组标记一下,二分总是有很多问题啊,所以写很多输出用来调试,jiong

/*************************************************************************
	> File Name: 460c.cpp
	> Author: yang
	> Mail:[email protected]
	> Created Time: 2014年08月22日 星期五 11:17:43
 ************************************************************************/

#include<iostream>
using namespace std;
#include<memory.h>
#include<stdio.h>
#define N 100005
int a[N];
int main(){
	int n,m,w,memory[N],b[N];
	while(cin>>n>>m>>w){
		int l=0x7FFFFFFF,r=0;
		for(int i=0;i<n;i++){
			cin>>a[i];
			if(a[i]<l) l=a[i];
			if(a[i]>r) r=a[i];
		}
		r+=m;//最长的高度
		while(l<=r){//这里一开始没有=号,wa了一次
			int tempm=m;
			int mid=(l+r)>>1;
			for(int i=0;i<n;i++){
				b[i]=mid-a[i];//b数组用来记录每朵花需要的天数
				if(b[i]<=0) b[i]=0;
			}
			memset(memory,0,sizeof(memory));//记住什么时候结束w长度的浇花
			int index=0,x=0;//x表示每朵花在因为前面浇花的的影响,也应该得到的浇花天数,例如前面i花浇x天,w为3,那么i+1,i+2的花也得到了x天的浇花
			for(int i=0;i<n;i++){
				x+=memory[i];
				if((b[i]-x)>0){
					b[i]-=x;
					tempm-=b[i];
					if(tempm<0){
						break;
					}
					x+=b[i];//x累计能从前面浇花时得到浇花天数
					memory[i+w]-=b[i];//长度活了w之后将的得到的浇花天数还回去
				}
			}
			if(tempm>=0)
				l=mid+1;
			else
				r=mid-1;
		}
		printf("%d\n",l-1);
	}
}
时间: 2024-10-11 23:40:27

codeforces 460C - Present 二分加模拟的相关文章

Codeforces 460C prsent(二分答案)

//题意:给定N朵花的原先的高度,从左到右排列, //最多浇水m天,每天只能浇一次,每次使得连续的w朵花的高度增长1,问最后最矮的花的高度最高是多少. # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { __int64 n,m,w,l,r,i,m1,sum; __int64 a[200010],b[200010]; while(~

CodeForces 460C Present

题意: 输入 n,m,w, n个数,每次将三个连续的w个数+1,加m次,使得最终的序列最大,输出最大序列里的最小的数 二分+贪心(详见代码) 1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 #define inf 0x3f3f3f3f 6 int a[100010],b[100010],memory[200020]; 7 int mai

Codeforces Round #262 (Div. 2) 460C. Present(二分)

题目链接:http://codeforces.com/problemset/problem/460/C C. Present time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Little beaver is a beginner programmer, so informatics is his favorite subjec

Codeforces 460C

比较裸的二分,但是比赛的时候脑抽,用树状数组瞎搞过了,但是边界条件没注意让hack了. 后来看到有人写了很简单的版本,又过了一遍,提醒一下自己不能忘记基本算法. #include<iostream> #include<cstdio> #include<cstdlib> #include<string.h> #include<math.h> #include<algorithm> #include<vector> #incl

CodeForces 424D: ...(二分)

题意:给出一个n*m的矩阵,内有一些数字.当你从一个方格走到另一个方格时,按这两个方格数字的大小,有(升,平,降)三种费用.你需要在矩阵中找到边长大于2的一个矩形,使得按这个矩形顺时针行走一圈的费用,与给定费用最接近.3<=n,m<=300. 思路:O(1)计算一个矩形的费用不是什么难事,因为考虑到有前缀性质(前缀性质:[l,r] = [0,r] - [0,l-1]),只要预处理好各行各个方向行走的费用,就容易计算. 直接枚举容易得到O(n^4)的算法.难以过.这时就应当想到优化.实际上,经过

Codeforces 475C Kamal-ol-molk&#39;s Painting 模拟

题目链接:点击打开链接 题意:给定n*m的矩阵 X代表有色 .代表无色 用一个x*y的矩阵形刷子去涂色. 刷子每次可以→或↓移动任意步. 若能够染出给定的矩阵,则输出最小的刷子的面积 若不能输出-1 思路: 先找到连续最小的x,y 因为至少一个边界和x或y相等,所以枚举(x,i) 和 (i,y)就可以了. #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <

CUGBACM_Summer_Tranning3 2013长沙现场赛(二分+bfs模拟+DP+几何)

A题:二分 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 用lower_bound可以轻松解决,不过比赛的时候逗逼了. 刚开始没有预处理,所以队友给出一组数据的时候没通过,然后一时紧张又想不出什么好的解决办法,所以就没再继续敲代码.实在有点可惜了. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #includ

hdu 4004 (二分加贪心) 青蛙过河

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4004 题目意思是青蛙要过河,现在给你河的宽度,河中石头的个数(青蛙要从石头上跳过河,这些石头都是在垂直于河岸的一条直线上) 还有青蛙能够跳跃的 最多 的次数,还有每个石头离河岸的距离,问的是青蛙一步最少要跳多少米可以过河> 这是一道二分加贪心的题,从0到的河宽度开始二分,二分出一个数然后判断在这样的最小步数(一步跳多少距离)下能否过河 判断的时候要贪心 主要难在思维上,关键是要想到二分上去,能想到

Codeforces 30D King&#39;s Problem? 模拟

首先将n个点排序,找出排序后的K,然后分情况讨论. 当 k == n+1时,显然是 k->1->n || k->n->1这两种的较小值,因为三角形的两边之和大于第三边. 当1 <= k && k <= n 时: 1 , k -> 1 -> n+1 -> k+1 ->n  ||  k -> n -> n+1 -> k-1 -> 1,当k+1 || k-1 不存在时将对应步骤忽略. 2 , k - > 1