language: C (gcc-4.3.4)
date: 97 days 16 hours ago
link:
visibility: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
int boxes[50005],a[50005],n,k;
 
void merge(int lower,int mid,int upper)
{
     int i=lower,j=mid+1,k=lower;
     while(i<=mid && j<=upper)
     {
                                 if(boxes[i]>=boxes[j])
                                     a[k++]=boxes[i++];
                                 else        
                                     a[k++]=boxes[j++]; 
     }
     while(i<=mid)
                  a[k++]=boxes[i++];
     while(j<=upper)
                    a[k++]=boxes[j++];
     for(i=lower;i<k;i++)
     {
                         boxes[i]=a[i];
     }
} 
 
int divide(int lower,int upper)
{
     int mid;
     mid = (lower + upper)/2;
     if(upper==lower)
                         return 0;
     divide(lower,mid);
     divide(mid+1,upper);
     merge(lower,mid,upper);
     return 1;
}
 
int bsearch(int lower,int upper)
{
     int mid = (lower+upper)/2,flag,p,j,u,max=0;
              
     for(;lower<=upper;mid=(lower+upper)/2)
     {
             flag=0;
             p=boxes[0]/mid;
             for(j=1;j<n;j++)
             {
                             
                             u=boxes[j]/mid;
                             if(u==0)
                                     break;
                             p+=u;
                             if(p>=k)
                             {
                                     flag=1;
                                     max=mid;
                                     break;
                             }
             }  
             if(flag)
                     lower=mid+1;
             else
                     upper=mid-1;
     }
     return max;
}
 
                    
 
int main()
{
    int t,i,maximum,s,count;
    scanf("%d%*c",&t);
    while(t--)
    {
              scanf("%d %d",&n,&k);
              for(i=0;i<n;i++)
                              scanf("%d",&boxes[i]);
              divide(0,n-1);
              if(boxes[0]==1)
              {
                             if(n<k)
                                    printf("0\n");
                             else
                             {
                                    for(i=0;i<n;i++)
                                                    if(boxes[i]==1)
                                                    count++;
                                    if(count>=k)
                                                printf("1\n");
                                    else
                                                printf("0\n");
                             }
              }
              else
              {
                             s=boxes[0]/k;
                             maximum=bsearch(s,boxes[0]);
                             if(s>maximum)
                                          maximum=s;
                             printf("%d\n",maximum);  
              } 
    }
    return 0;              
}
 
  • upload with new input
  • result: Success     time: 0.01s    memory: 2112 kB     returned value: 0

    1
    1 7
    7
    1