hdoj 5248 序列变换 【贪心 + 二分】
2016-02-18 00:49
246 查看
序列变换
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 922 Accepted Submission(s): 422
[align=left]Problem Description[/align]
给定序列A={A1,A2,...,An},
要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:Bi<Bi+1,1≤i<N)。
我们定义从序列A到序列B变换的代价为cost(A,B)=max(|Ai−Bi|)(1≤i≤N)。
请求出满足条件的最小代价。
注意,每个元素在变换前后都是整数。
[align=left]Input[/align]
第一行为测试的组数T(1≤T≤10).
对于每一组:
第一行为序列A的长度N(1≤N≤105),第二行包含N个数,A1,A2,...,An.
序列A中的每个元素的值是正整数且不超过106。
[align=left]Output[/align]
对于每一个测试样例,输出两行:
第一行输出:"Case #i:"。i代表第 i 组测试数据。
第二行输出一个正整数,代表满足条件的最小代价。
[align=left]Sample Input[/align]
2 2 1 10 3 2 5 4
[align=left]Sample Output[/align]
Case #1: 0 Case #2: 1
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[100010]; bool judge(int v,int n) { int pre,i,MAX,MIN; for(i=1;i<=n;i++) { if(i==1) pre=a[i]-v; else { MAX=a[i]+v; MIN=a[i]-v; if(MAX<=pre) return false; if(MIN>pre) pre=MIN; else pre++; } } return true; } int main() { int t; int n,i; int k=1; scanf("%d",&t); while(t--) { int MAX=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); MAX=max(MAX,a[i]); } int l=0,r=MAX*10000,ans; while(r>=l) { int mid=(l+r)/2; if(judge(mid,n)) { ans=mid; r=mid-1; } else { l=mid+1; } } printf("Case #%d:\n%d\n",k++,ans); } return 0; }
相关文章推荐
- Fragment
- c语言:编程找出1000之内的所有完数。
- Visual Studio 2013光标变成方块
- 图解ios程序生命周期
- 1085. Perfect Sequence (25)
- Learning Python ~Ch4: Introducing Python Object Types (上) ~重点整理
- Android LayoutInflater布局填充器
- day4作业
- 常去的论坛今天两个传统行业的坛友要下岗了
- 验证码ocrking接口
- Codeforces Round #127 (Div. 1) D. Brand New Problem 暴力dp
- jquery ajax全局方法的使用
- Android Wear 报错:cannot connect to localhost:4444: 由于目标计算机积极拒绝,无法连接。 (10061)
- Python学习之day4
- word2vec词向量训练及中文文本相似度计算
- 【Aizu 2305】Beautiful Currency
- noj 1059 搬寝室
- ListView用SimpleAdapter显示图片和文本
- 使用Android Studio开发遇到的问题
- PAT习题解:1010. Radix (25)