題目:acdream 1216 beautiful people
題意:每乙個人有兩個值,能力值和潛力值,然後要求乙個人的這兩個值都嚴格大於第二個人的時候,這兩個人才幹呆在一塊兒,給出很多人的值,求最多有多少個人?
分析:非常easy想到是個單調非增模型,假設用o(n*n)的寫法的話,會超時!
那麼我們就要用二分優化來找。
我們能夠先按第乙個值 x 從小到大排序,然後按第二個值從大到小排序,這種話找出的最長個數是沒有錯的。(想想為什麼)
假如這樣乙個例子:
1 10
2 12
3 53 1
4 36 7
首先dp陣列僅僅有第一,二組例子:1 10 和2 12
然後第三個例子替換第一組:3 5 和 2 12 ,看看這組例子,發現不滿足,可是他總的長度不會變,可是這樣儲存的話能保證後面出來的數可以最長。所以要想辦法儲存路徑
然後第四組例子替換第三組:3 1 和 2 12
然後第5組例子替換第二組: 3 1 和 4 3 是不是滿足條件了,並且最大值值變的更小了,
然後第六組例子加在後面:3 1 和 4 3 和 6 7 ,最大值
最後全部值的二分搜尋的值為:1 2 1 1 2 3
那麼發現儲存路徑也簡單了。
然後從這個值裡面輸出乙個遞減的初始陣列標號就能夠了、
ac**:
#include #include #include #include #include using namespace std;
const int inf = 0x3f3f3f3f;
const int n = 110000;
struct node
;node a[n];
int cmp(node a,node b)
int dp[n],mark[n];
int bin_search(int l,int r,int x)
return l;
}int main()
sort(a+1,a+n+1,cmp);
memset(dp,0x3f3f3f3f,sizeof(dp));
int ans=0;
int len = 1;
for(int i=1;i<=n;i++)
printf("%d\n",ans);
for(int i=n;i>=1;i--)
}printf("\n");
}return 0;
}
NYOJ 214 單調遞增子串行 二
先開設乙個陣列dp 然後從第乙個數開始列舉,和dp 陣列中的最後乙個元素end 進行比較,如果大於end 直接把這個數接到end 的後面,並且把end 更新為列舉的這個數。如果不大於edn 在dp 陣列中找到第乙個大於這個數的位子 k,並用這個數 替換掉dp k 例如 x 5,dp 則列舉過x 之後...
NYOJ 214 單調遞增子串行 二
單調遞增子串行 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給定一整型數列 0如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入 有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡...
nyoj 214 單調遞增子串行 二
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給定一整型數列 0 如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入 有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡有n個整數,表示數...