2015百度之星预赛1 1003(二分)
2015百度之星初赛1 1003(二分)
Problem Description
给定序列
我们定义从序列A到序列B变换的代价为
请求出满足条件的最小代价。
注意,每个元素在变换前后都是整数。
Input
第一行为测试的组数
对于每一组: 第一行为序列A的长度
Output
对于每一个测试样例,输出两行:
第一行输出:"Case #i:"。i代表第 i 组测试数据。
第二行输出一个正整数,代表满足条件的最小代价。
思路见码:
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> using namespace std; #define LL long long const int maxn = 100000 + 100; const int INF = 0x3f3f3f3f; //freopen("input.txt", "r", stdin); int A[maxn], B[maxn]; bool testok(int n, int k) { B[0] = -1000005; for(int i = 1; i <= n; i++) { if(A[i] > B[i - 1]) { B[i] = max(B[i - 1] + 1, A[i] - k); } else { if(A[i] + k <= B[i - 1]) return false; else B[i] = B[i - 1] + 1; } } return true; } int main() { int T, kase = 0; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &A[i]); int le = 0, ri = 1000000; while(le < ri) { int mi = (le + ri) >> 1; if(testok(n, mi)) ri = mi; else le = mi + 1; } printf("Case #%d:\n", ++kase); printf("%d\n", ri); } return 0; }
相关推荐
- 百度之星2018初赛Bt4 P1m2(二分答案)
- 2016"百度之星" - 预赛(Astar Round2B)1001 1003~1006
- 百度之星预赛(1) 1003 序列变换 二分搜索
- 2015 百度之星 预赛2 1003 棋盘占领 (bfs)题解
- 2015百度之星预赛(1)题解(1001)
- BC 二零一五年百度之星程序设计大赛 - 初赛(1)(序列变换-二分答案贪心)
- 2015 百度之星 预赛2 1002 连接的管道(最小生成树)
- 百度之星 2015 预赛(1) 1002 找连续数
- 2015年百度之星程序设计大赛 1001 大搬家 1002 列变位法解密 1003 IP聚合 1004 放盘子
- 2015 百度之星 预赛1 1001(贪心)
- POJ锻炼计划3041_Asteroids(二分图/最小点覆盖=最大匹配)
- 一个懦弱的软件工程师