題目大意:2n個村莊,n個富有,n個貧窮,貧窮的需要從富有村莊進口東西,也就是說需要建一條路,一直編號都是從1……n,問最多可以減多少條路,滿足貧窮村莊編號大的則相連的富有的編號也大。
思路:最長上公升子串行問題。g[i]表示序列長度為i的最小村莊編號,dp[i]表示第i個村莊為最後乙個村莊時總共有多少條路。每次從g中找到小於arr[i]的位置,及加入arr[i]後dp[i]的值,並更新g[i] , 最後求最大的dp值即可
ps:輸出時因為1和大於1的不一樣, road變為roads,,,,,,細節決定成敗!!
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define maxn 1000005
#define mod 1000000007
#define mem(a) memset(a , 0 , sizeof(a))
#define ll __int64
#define inf 999999999
int n ;
int dp[maxn];
int g[maxn];
int arr[maxn];
int find(int a,int l,int r)
}return l;
}int main()
for(int i = 0 ; i <= n ; i ++) g[i] = inf;
mem(dp);
for(int i = 1 ; i <= n ; i ++)
int ans = 0;
for(int i = 1 ; i <= n ; i ++)
if(ans < dp[i]) ans = dp[i];
if(ans == 1) printf("case %d:\nmy king, at most %d road can be built.\n\n" , ++k , ans);
else printf("case %d:\nmy king, at most %d roads can be built.\n\n" , ++k , ans);
}return 0;
}
hdu 1025 最長上公升子串行 排序
因為題目給出不能交叉,一條邊的兩個點乙個看做下標,乙個看做值,那麼就是 i j,then a i a j 所以滿足上公升不降子串行,求建路條數最多,其實就是最長上公升子串行 ac 如下 採用的是nlogn的二分法模板求取最長上公升子串行模板及講解鏈結 include include include ...
HDU 1025 最長上公升子串行nlogn
剛開始題目理解錯了,第乙個數字是a陣列下標,第二個是陣列的值,nlogn演算法寫法用到了二分查詢 還有這題輸出很坑,乙個道路是是road,兩個以上是roads include include include include include include include include includ...
HDU1025最長上公升子串行問題
下面向上面邊線,只要保證從左到右目的連線目的地是按序上公升即可保證不交叉,此問題則轉化成了最長上公升子串行問題。hdu 1025 請求序列構成按序增加即可達到連線不相交,序列長度即題目解,因此題目轉化為求最長上公升子串行問題。注意 僅有一條路時,為road,否則為roads。include incl...