HDU5248 序列变换(二分)
2016-06-02 21:12
267 查看
序列变换
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1033 Accepted Submission(s): 471
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,...,An.
序列A中的每个元素的值是正整数且不超过106。
Output
对于每一个测试样例,输出两行:
第一行输出:"Case #i:"。i代表第 i 组测试数据。
第二行输出一个正整数,代表满足条件的最小代价。
Sample Input
2
2
1 10
3
2 5 4
Sample Output
Case #1:
0
Case #2:
1
Source
2015年百度之星程序设计大赛
- 初赛(1)
Recommend
hujie | We have carefully selected several similar problems for you: 5717 5716 5715 5714 5713
思路:用二分找到最小的代价值x,然后倒着让每个数字都在x的变化范围内单调递减,如果无法实现就return false,左边界为x + 1,否则右边界是x。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main() { int t,n,i,j,k,l,m,a[110000]; scanf("%d",&t); k=1; while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); int l=0; int r=1000000; int ans=-1; while(l<=r) { int mid=(l+r)/2; int flag=1; int later=a +mid; for(i=n-1;i>0;i--) { if(a[i]+mid<later) { later=a[i]+mid; } else if(a[i]-mid>=later) { flag=0; break; } else { later--; } } if(flag) { ans=mid; r=mid-1; } else { l=mid+1; } } printf("Case #%d:\n",k++); printf("%d\n",ans); } return 0; }
相关文章推荐
- leetcode Group Anagrams
- 虚拟机vm下ubuntu server 14.04的网络配置和SSH连接问题
- [疯狂Java]泛型:泛型的定义(类、接口、对象)、使用、继承
- Android 可输入下拉列表的实现
- 欢迎使用CSDN-markdown编辑器
- BZOJ_1005_ [HNOI2008]_明明的烦恼_(组合数学+purfer_sequence+高精度+分解因数+快速幂)
- linux之缓冲区
- Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)
- Saiku屏蔽登陆,删除欢迎页面
- 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest(K. King's Rout)(拓扑排序)
- centos 6.5下搭建DNS服务器
- Tomcat内存设置详解
- Topcoder SRM 636 Div2 C
- STM32F0xx_DAC输出电压配置详细过程
- _mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h':no such file or directory
- FTP上传类
- git常用命令
- SQL Server中在存储过程中使用游标修改表中数据
- MapReduce中job参数及设置map和reduce的个数
- hdoj-1233-还是畅通工程