hdu5884 二分 排序

2021-07-22 19:29:42 字數 1443 閱讀 2600

題目大意:給你n個序列,將其合併為乙個,每次合併序列的花費為所合併子串行長度的和,先給你總花費t,問每次最少合併多少個子序列。

思路:排序,每次從最小的開始合併,這樣能保證最優。然後二分k即可。有兩點需要注意:

1、合併分為很多次,每次合併後變為乙個序列,這個序列的長度已經不是最小,需要重新加入到所有剩餘序列中去合併(比賽時忽略了這一點,一直把他放在第一位)

2、二分k時,如果(n-1)%(k-1) 大於0,則將其餘數+1個數先合併,這樣最優。。。。。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#pragma comment(linker, "/stack:102400000,102400000")

#define maxn 100005

#define mod 1000000007

#define mem(a , b) memset(a , b , sizeof(a))

#define ll long long

#define ull unsigned long long

#define for(i , n) for(int i = 1 ; i<= n ; i ++)

typedef pairpii;

int t , n , m;

int a[maxn] , sum[maxn];

priority_queue, greater>p;

bool solve(int dis)

for(int i = mo + 1 ; i <= n ; i ++) p.push(a[i]);

int up = (n - 1) / (dis - 1);

// cout << all << endl;

for(int i = 0 ; i < up ; i ++)

all += tt;

p.push(tt);

// cout << all << "ffff" << endl;

}// cout << all << " " << "yes" << endl;

if(all > m) return false;

return true;

}int main()

sort(a +1 , a + 1 + n);

sum[0] = 0;

for(int i = 1 ; i <= n ; i ++)

int l = 2 , r = n;

while(l < r)

if(n <= 1) r = 1;

printf("%d\n" , r);

}return 0;

}

二分排序(java)

基本思想就是 將待排序元素分成大小大致相同 的兩個子集合,分別 對兩個子集合進行排序,最終將排好序的子集合合併成所要求的排好序的集合。package com.suanfa 二分排序 author administrator public class merge 合併陣列 public void co...

演算法 二分排序

二分排序這個詞是我在面試中遇到的,當時第一反應是二分查詢,然後被打斷,是二分排序演算法,最終才了解到,二分排序就是我們熟知的歸併排序。它又稱二路排序。首先說一下歸併的思想 先將一組數列,數列中含有n個元素,假設將每乙個元素看成是乙個有序的數列,就是n個有序的子串行,每個子串行的長度為1,然後倆倆合併...

二分排序演算法

bool check int x 檢查x是否滿足某種性質 區間 l,r 被劃分成 l,mid 和 mid 1,r 時使用 intbsearch 1 int l,int r return l 區間 l,r 被劃分成 l,mid 1 和 mid,r 時使用 intbsearch 2 int l,int ...