The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 貪心

 

題目大意:ios

對於給出的n個冰激凌球的大小,知足下面的球的大小是上一個的至少2倍,對於給出的k(由k的冰激凌球才能算做一個冰激凌塔),問n個冰激凌球能夠最多堆出多少個高度爲k的冰激凌塔數組

題目分析:函數

對於n個冰激凌球,顯然咱們得知能夠堆出的高度爲k的塔的數量在0~[n / k]之間,這裏能夠經過二分遍歷每一種可能,初始時二分邊界l==0,r==[n / k],每次取中間值mid=(l+r)/ 2,判斷mid高度爲k的塔可否堆出,若是能夠則嘗試mid爲更大,不然則嘗試mid爲更小時,不斷二分嘗試mid是否可行,而對於每一個mid,咱們要寫一個判斷函數,來判斷mid座高度爲k的冰激凌塔可否堆出,這裏用到了貪心的思惟,咱們先對n個冰激凌球的大小進行從小到大的排序,而後對於mid座塔咱們只要建立一個一維數組,0~mid-1放置排完序的冰激凌球的前mid個(因爲已經將冰激凌球排序,取出前mid個放入這個數組便可),而後循環k-1遍(由於高度初始已經爲1,只要再判斷k-1層的狀況便可),從編號爲mid開始依次選取冰激凌球(從小到大)與這個0~mid-1個位置進行比較,若是知足是它的至少兩倍則更新0~mid-1位置的冰激凌球大小,不然繼續日後找一個知足的冰激凌球去替換它,完成了一層以後則繼續從0~mid-1開始(共k層),假如中途出現冰激凌球已經遍歷到最後,可是仍是k層冰激凌塔沒有完成堆疊,則返回失敗,不然在結束全部k層的每一個判斷後返回成功spa

關於貪心的部分,因爲數組是從小到大排序的,若是遇到一個位置不知足是它的至少兩倍則將下標日後移動,前面的就被捨棄了(由於對後面的位置來講,它必定是比前面位置大的,指向該下標的冰激凌球大小若是不知足前者至少兩倍,則不可能知足後者的至少兩倍關係,而從小到大排序選擇也是知足了最優的選擇方案,先用小的試探,後用大的試探,小的必定在前面)code

代碼:blog

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 const int M = 300005;
 7 long long ice[M];
 8 long long update[M];
 9 int n, k;
10 
11 bool judge(int x){        //x表明判斷作x個塔是否可行 
12     for(int i = 0; i < x; i++){
13         update[i] = ice[i];
14     }
15     int cnt = x;
16     for(int i = 1; i < k; i++){
17         for(int j = 0; j < x; j++){
18             while(update[j]*2 > ice[cnt] && cnt < n) cnt++;
19             if(cnt == n) return false;
20             update[j] = ice[cnt];
21             cnt++;    
22         }
23     }
24     return true;
25 }
26 
27 int main(){
28     int t;
29     scanf("%d", &t);
30     int cnt = 1;
31     while(t--){
32         scanf("%d%d", &n, &k);
33         for(int i = 0; i < n; i++) scanf("%lld", &ice[i]);
34         sort(ice, ice + n);
35         int l = 0;
36         int r = n/k;
37         int ans = 0;
38         while(l <= r){
39             int m = (l+r)/2;
40             if(judge(m)){
41                 l = m+1;
42                 ans = m;
43             }else{
44                 r = m-1;
45             }
46         }
47         printf("Case #%d: %d\n", cnt++, ans);
48     } 
49     return 0;
50 }
相關文章
相關標籤/搜索