hdu5248序列变换(二分+贪心)基础题
生活随笔
收集整理的這篇文章主要介紹了
hdu5248序列变换(二分+贪心)基础题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意(中文的直接粘題意吧)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??序列變換
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
思路:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??序列變換
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
思路:
? ? ? 思路簡單一下就能想到,二分當前答案,對于當前答案,從頭開始貪心,能小就盡可能的小就行了。
#include<stdio.h> #include<string.h>int A[100005] ,B[100005];int maxx(int x ,int y) {return x > y ? x : y; }int jude(int k ,int n) {for(int i = 1 ;i <= n ;i ++){if(i == 1) B[i] = A[i] - k;else{if(A[i] > B[i-1]) B[i] = maxx(B[i-1]+1 ,A[i] - k);else{if(A[i] + k > B[i-1]) B[i] = B[i-1]+1;else return 0;}}}return 1; }int main () {int t ,n ,cas = 1 ,i;scanf("%d" ,&t);while(t--){scanf("%d" ,&n);for(i = 1 ;i <= n ;i ++)scanf("%d" ,&A[i]);int low = 0 ,up = 1000005 ,mid ,ans;while(low <= up){mid = (low + up) >> 1;if(jude(mid ,n)) ans = mid ,up = mid - 1;else low = mid + 1;}printf("Case #%d:\n" ,cas ++);printf("%d\n" ,ans);}return 0; }
總結
以上是生活随笔為你收集整理的hdu5248序列变换(二分+贪心)基础题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu5247找连续数(打表)
- 下一篇: hdu5249KPI动态中位数(两个se