日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu5248序列变换(二分+贪心)基础题

發布時間:2025/6/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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


思路:

? ? ? 思路簡單一下就能想到,二分當前答案,對于當前答案,從頭開始貪心,能小就盡可能的小就行了。


#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序列变换(二分+贪心)基础题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。