HDU5248 序列變換 二分

2021-07-03 00:11:13 字數 859 閱讀 1997

分析:序列中元素的值不大於10^6,可知變換代價最多不會超過10^6,這樣我們可以在這個範圍內二分查詢出最小的變換代價,初始化左右邊界left=0,right=10^6+1,對於每乙個代價mid=(left+right)/2,我們都遍歷a陣列(正序倒序遍歷都行,區別就在於:正序遍歷的話每個元素的值改變所需的代價是增加的,而倒序是減少的,我們拿倒序遍歷來說),先定義tmp=a[n]+mid,然後從i=n-1開始往前遍歷:

(1)如果遇到a[i]-mid>=tmp,說明當前元素a[i]減少mid(mid為當前情況的最大代價)時也不能滿足題意中的「嚴格單調」情況,這時就說明mid的值選小了,令left=mid+1,然後重新遍歷;

(2)如果a[i]+mid>tmp,說明當前元素a[i]在改變代價少於mid的情況下就可以滿足「嚴格單調」的條件了,這時就更新tmp的值為a[i]+mid,因為我們要保證前面的每個值都小於後面的值,就需要找出後面元素中最小的乙個元素,在其能改變的代價範圍內確定前面元素的改變值;

(3)如果不滿足上面兩個條件,就說明當前的tmo值對於a[i]來說是合法的,為了保證「嚴格單調」,我們需要令tmp=tmp-1。

實現**如下:

#include #include using namespace std;

const int maxn=100005;

int a[maxn],n;

//倒序遍歷

bool judge(int mid)

return true;}/*

//正序遍歷

bool judge(int mid)

printf("case #%d:\n%d\n",t++,l);

}return 0;

}

HDU5248 序列變換

傳送門 序列變換 二分答案。如果乙個數加上當前代價後仍然小於前乙個數減去當前代價,那麼該值不可行,二分找到最小值。include define ll long long define inf 0x3f3f3f3f using namespace std const int maxn 1e5 5 in...

HDU 5256 序列變換

題意 我們有乙個數列a1,a2.an,你現在要求修改數量最少的元素,使得這個數列嚴格遞增。其中無論是修改前還是修改後,每個元素都必須是整數。請輸出最少需要修改多少個元素。思想 第i個位置到第i k個位置可以使當中k 1個相等的數通過變換滿足題意,首先把i位置上的數減去i,消除位置的影響 1 2 4 ...

hdu5256 序列變換 dp LIS

點選開啟鏈結 思路 lis的變形,唯一不同的是條件a i i a j j 1,i j。因為要確保這兩個元素之間能插入i j 1個元素 每個數先減去它的下標,防止下面的情況發生 加入序列是1,2,2,2,3,這樣求上公升子串行是3,也就是要修改2個,但是中間的兩個2,變化範圍又不能超過 1,3 那麼這...