HDU ACM 5248 序列变换->二分代价+贪心

分析:二分代价,由于序列是单增的,我们使前面一个数相对取最小,这样后面的数变化的值也能相对较小(贪心)。

#include<iostream>
using namespace std;

#define N 100010
#define max(a,b) ((a)>(b)?(a):(b))
int num[N],tmp[N],n;

bool valid(int cost)
{
	int i;

	for(i=1;i<=n;i++)
		tmp[i]=num[i];
	tmp[1]=tmp[1]-cost;
	for(i=2;i<=n;i++)
		if(num[i]+cost<=tmp[i-1])
			return false;
		else
			tmp[i]=max(num[i]-cost,tmp[i-1]+1);
	return true;
}

int main()
{
	int T,t,l,r,ans,mid,i;

	cin>>T;
	t=0;
	while(T--)
	{
		cin>>n;
		for(i=1;i<=n;i++) cin>>num[i];

		ans=0;
		l=0;
		r=1000000;
		while(l<=r)                      //二分代价
		{
			mid=(l+r)>>1;
			if(valid(mid))
			{
				ans=mid;
				r=mid-1;
			}
			else
				l=mid+1;
		}
		cout<<"Case #"<<++t<<":"<<endl;
		cout<<ans<<endl;
	}
    return 0;
}
时间: 2024-11-06 06:57:21

HDU ACM 5248 序列变换->二分代价+贪心的相关文章

BC 2015年百度之星程序设计大赛 - 初赛(1)(序列变换-二分答案贪心)

序列变换 Accepts: 816 Submissions: 3578 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 给定序列A={A 1 ,A 2 ,...,A n } , 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:B i <B i+1 ,1≤i<N ). 我们定义从序列A到序列B变换的代价为cost(A,B

HDU ACM 5256 序列变换

题意:一个数列,a1,a2,a3,a4,---,an,需要最少修改多少个元素,使得这个序列严格递增? 分析:因为a[i]<a[i+1],且a[i],a[i+1]都是整数,所以有a[i+1]-1>=a[i],整理得a[i+1]-(i+1)>=a[i]-i.令b[i]=a[i]-i.则可以求出b[i]的最长不下降子序列的长度len,最后用n-len即为需要改变的最少的元素个数. #include<iostream> #include<algorithm> using

hdu 5248 序列变换(二分枚举)

Problem Description 给定序列A={A1,A2,...,An}, 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:Bi<Bi+1,1≤i<N). 我们定义从序列A到序列B变换的代价为cost(A,B)=max(|Ai−Bi|)(1≤i≤N). 请求出满足条件的最小代价. 注意,每个元素在变换前后都是整数. Input 第一行为测试的组数T(1≤T≤10). 对于每一组: 第一行为序列A的长度N(1≤N≤105),第二行包含N个数,A1,A2,...,A

hdu 5248 序列变换【二分】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5248 分析:这道题是2015百度之星初赛1的3题 当时队友做的,后来也做了一下,可以用二分来做,另外还有一点小贪心, 因为题目数据范围不超过10^6,那么x=二分[0,10^6],使序列里的每一个数变化范围 值为x,求使序列变为升序的最小x值 另外贪心就是,我每一个数尽量X[i]变为X[i-1]+1,因为序列要升序,这样可以保证 对X[i+1]要求X[i+1]>X[i]的条件变得宽松, 献上代码:

hdu 5248 序列变换

中文题意,略(但弱鸡的我还是把题目读错了,一直到读题解的时候才发现,弱鸡总会读错题目,我以为跑一下lis就行了,太天真) 但现在还是没有想到为什么会用二分(虽然大家都是这么说的,而且这是二分专题,emmm) #include <set> #include <map> #include <queue> #include <stack> #include <math.h> #include <vector> #include <st

HDU ACM 1055 Color a Tree-&gt;树上的贪心

题意:给一棵树染色,这棵树有n个节点,根结点是r.每个结点都有一个权值ci,开始时间为0,每染色一个结点需要耗时1,每个结点染色代价为ci*ti(ti为当前时间),每个结点只有在父结点被染色的条件下才能被染色.求染完整棵树要花费的最小代价. 分析:贪心总体思路,每次找一个权值最大的节点,如果是根节点,则首先对它染色,否则的话可以得出一个结论,在它父亲已经染色的情况下,立刻给它染色是最优的.对于第二种情况,当它不是根节点,且已对它父亲染了色,则一定会立刻对它染色,所以可以把它和它父亲合并为同一个节

hdu5248---序列变换(二分答案+贪心)

先二分答案,然后从后往前贪心就行 /************************************************************************* > File Name: hdu5248.cpp > Author: ALex > Mail: [email protected] > Created Time: 2015年05月31日 星期日 10时46分06秒 *******************************************

【HDU】5256 序列变换(最长上升子序列变形)

如果a[i]和a[j]想不变,需要满足的条件就是 a[j] - a[i] > j - i 也就是a[i] - i < a[j] - j 比如1 4 2 就不满足,所以1和2之间一定有一个需要改变 所以我们对所有a[i] - i求其最长上升子序列就可以了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100005; con

HDU ACM 5246 超级赛亚ACMer 贪心

分析:先把每个挑战者的战斗力升序排序,接着找出离m最近的小于m的挑战者的战斗力,然后从该处开始,对后面的每个挑战者进行处理,尽量使百小度提升战斗力后等于后一个挑战者的战斗力.如果激发战斗力后还无法打赢则不行,否则使其相等. #include<iostream> #include<algorithm> using namespace std; int main() { int T,t,n,m,k,i; __int64 a[10005]; __int64 cnt; int tmp; b