題目大意:給你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 ...