编程之美第三题 序列变换tiyi
2015-05-30 21:46
344 查看
题意: 给你一个序列 , 让你改变序列中的所有值, 最后保证序列变成一个绝对递增的序列 , 也就是每个a[i+1] 〉a[i], 然后有一个消耗为 max | a[i] - b[i]|, 问消耗最小为多少。
题解: 很显然 最大值最小问题, 明显二分, 然后再保证第一个最小的同时 , 后面的和第一个尽量靠近, 然后就A了 , 这次编程之美比赛题目确实好水呀, 没sei了!
代码:
题解: 很显然 最大值最小问题, 明显二分, 然后再保证第一个最小的同时 , 后面的和第一个尽量靠近, 然后就A了 , 这次编程之美比赛题目确实好水呀, 没sei了!
代码:
[code]#include<stdio.h> int n, mark[1000005], value[1000005]; int slove(int x) { for(int i = 1; i <= n; i++) mark[i] = value[i]; // if(x >= mark[1]) mark[1] = 1; mark[1] -= x; for(int i = 2; i <= n; i++) { if(mark[i] + x <= mark[i-1]) return 0; if(mark[i] - x > mark[i-1]) mark[i] -= x; else mark[i] = mark[i-1] + 1; } return 1; } int main() { int T, flag1 = 1; scanf("%d", &T); while(T--) { scanf("%d", &n); int flag = 0, Max; scanf("%d", &value[1]); Max = value[1]; for(int i = 2; i <= n; i++) { scanf("%d", &value[i]); if(value[i] <= value[i-1]) flag = 1; if(Max < value[i]) Max = value[i]; } printf("Case #%d:\n", flag1 ++); if(!flag) { printf("0\n"); continue; } int l = 1, r = 1000004, mid, ans; while(l <= r) { mid = (r+l)/2; // printf("%d\n", mid); if(slove(mid)) { ans = mid; r = mid - 1; } else l = mid + 1; } printf("%d\n", ans); } }
相关文章推荐
- Java代码 实现直接选择排序
- 【末世旅行之C++】C++中的虚函数和纯虚函数的理解
- 编程之美第二题 找连续数
- PHP Cookies
- PHP Cookies
- java model2用户登录简单实例
- Java for LeetCode 129 Sum Root to Leaf Numbers
- 编程之美第一题 超级赛亚ACMer
- Java RandomAccessFile用法
- 三、JAVA中的IO流,输出流
- java抽象类和接口详解
- java的事件处理机制
- C语言及程序设计进阶例程-21 银行储蓄系统(第五版)开发
- 欧拉工程第46题:Goldbach's other conjecture
- 代码混装5.30
- 20条编程经验
- hadoop之HDFS/MapReduce的java接口简单测试
- rbenv Your user account isn't allowed to install to the system Rubygems
- 测试python awk sed 读取文件指定位置时的性能
- Spring AOP--引入增强