給你t組樣例,每組樣例給出n(<=1e5),k(<=n),再給你n個數組成的序列。問你能不能通過減去該序列中x(<=k)個數,使該序列變成乙個非遞增或非遞減序列。可以輸出a is a magic array.,不行就輸出a is not a magic array.。
這題可以轉化成最長上公升子串行的題。我們正著做一遍最長非遞減序列(基本就是比最長上公升子串行多個=)得出其長度len,如果len+k>=n說明可以變成非遞減序列,如果不行我們就再把原序列倒著做一遍非遞減(正著就是非遞增)得出其長度len,再判斷len+k>=n說明可以變成非遞增序列,否則說明不行。
最長上公升子串行之前已經講過了,這裡用講的第一種做法即自己寫二分做。(也可以用stl)
最長上公升子串行詳解
#include
using
namespace
std;
typedef
long
long ll;
const
int maxn = 1e5+5;
int a[maxn],n,k;
int d[maxn],len;
void binary_search(int x)
if(l) d[l+1]=x;
}int main()
if(len+k>=n) printf("a is a magic array.\n");
else
if(len+k>=n) printf("a is a magic array.\n");
else
printf("a is not a magic array.\n");}}
return
0;}
HDU6197 最長有序子串行 DP 二分查詢
利用dp 二分查詢依次找出最長遞增子串行和最長遞減子串行,取二者中較大值。如果結果 ans n k 那麼這樣的序列滿足條件是乙個魔法陣列。include include include include include include using namespace std define int 0x...
最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
最長上公升子串行
最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...