6 solutions

  • 2
    @ 2022-2-23 16:06:12

    二分答案

    #include<iostream>
    using namespace std;
    const int N=1e6+7;
    int a[N],n,k;
    int main(){
    	cin>>n>>k;
    	for(int i=1;i<=n;i++) 
            cin>>a[i];
    	int l=1,r=N,mid=0,ans;
    	while(l<=r){
    		mid=(r+l)/2;
    		int tmp=0;
    		for(int i=1;i<=n;i++)
    			tmp+=(a[i]/mid);
    		if(tmp<k) r=mid-1;
    		else l=mid+1,ans=mid;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1
      @ 2022-2-12 11:26:25
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e7+5;
      int a[N],n,k,sum=0,l=0,r,ans;
      bool check(int x){
      	int g=0;
      	for(int i=1;i<=n;i++){
      		g+=a[i]/x;
      	}
      	return g>=k;
      }
      int main(){
      	cin>>n>>k;
      	for(int i=1;i<=n;i++){
      		cin>>a[i];
      		sum+=a[i];
      	}
      	sort(a+1,a+n+1);
      	r=sum/k;
      	if(a[1]<k){
      		cout<<0;
      		return 0;
      	}
      	if(a[1]==k){
      		cout<<a[1];
      		return 0;
      	}
      	while(l<=r){
      		int mid=(l+r)>>1;
      		if(check(mid)){
      			l=mid+1;
      		}
      		else{
      			r=mid-1;
      		}
      	}
      	cout<<l-1;
      	return 0;
      }
      • 0
        @ 2022-12-18 18:12:45

        二分

        #include<iostream>
        using namespace std;
        #define ll long long
        const int N = 1e7 + 5;
        ll n, k, Max;
        ll a[N];
        bool check(ll x) {
        	ll cnt = 0;
        	for (ll i = 1; i <= n; ++i) {
        		cnt += a[i] / x;
        	}
        	return cnt >= k;
        }
        int main() {
        	scanf("%lld%lld", &n, &k);
        	for (ll i = 1; i <= n; ++i) {
        		scanf("%lld", &a[i]);
        		if (a[i] > Max)Max = a[i];
        	}
        	ll l = 0, r = Max, mid;
        	while (l < r) {
        		mid = (l + r) >> 1;
        		if (check(mid))l = mid + 1;
        		else r = mid;
        	}
        	printf("%lld\n", r - 1);
        	return 0;
        }
        
        • 0
          @ 2022-5-7 20:45:27
          #include<iostream>
          
          using namespace std;
          typedef long long LL;
          const int N=1e8+10;
          int n,k;
          LL a[N];
          bool check(int x){
          	int m=0;
          	for(int i=0;i<n;i++){
          		m+=a[i]/x;//a[i]/x表示的是当前木棍能切出的长度为x的块数,把所有木棍的对应值加起来就是当前x的最大切出来的块数 
          	}
          	if(m>=k){
          			return true;
          	}
          	return false;
          }
          int main()
          {
          	cin>>n>>k;
          	for(int i=0;i<n;i++) cin>>a[i];
          	int l=0,r=N;
          	while(l<r){
          		int mid=(l+r+1)/2;
          		if(check(mid)) l=mid;//如果当前的最大值满足大于等于k,说明l还有可能更大,所以往右边找 
          		else r=mid-1;
          	}
          	cout<<l<<endl;
          	return 0;
          }
           
           
          
          • 0
            @ 2022-2-24 17:33:02

            #include<bits/stdc++.h>

            using namespace std;

            long long n, k;

            long long a[1000005];

            bool check(long long x) {

            long long cnt = 0;
            for (int i = 0; i < n; i++) {
            	cnt += a[i] / x;
            }
            return cnt >= k;
            

            }

            int main() {

            cin >> n >> k;
            for (int i = 0; i < n; i++) cin >> a[i];
            long long l = 0, r = 100000001;
            while (l  < r) {
            	long long mid = (l + r+1)>>1;
            	if (check(mid)) l = mid;
            	else r = mid-1;
            }
            cout << l << endl;
            return 0;
            

            }

            • 0
              @ 2022-2-12 16:19:57

              嗯,经典二分,找到条件就可以了

              #include<iostream>
              #include<algorithm>
              using namespace std;
              const int N=1e6+7;
              
              int n,m,ans,a[N];
              
              bool check(int x){
              	int k=0;
              	for(int i=0;i<n;i++){
              		k+=a[i]/x;
              		if(k>=m)return true;
              	}
              	return false ;
              }
              
              int find(int l,int r){
              	int mid;
              	while(l<=r){
              		mid=(l+r)>>1;
              		if(cheak(mid))l=mid+1;
              		else r=mid-1;
              	}
              	return l-1;
              }
              
              int main(){
              	cin>>n>>m;
              	for(int i=0;i<n;i++){
              		cin>>a[i];
              	}
              	sort(a,a+n);
              	ans=find(0,10000007);
              	cout<<ans;
              	return 0;
              }
              
              • 1

              Information

              ID
              281
              Time
              1000ms
              Memory
              256MiB
              Difficulty
              4
              Tags
              # Submissions
              131
              Accepted
              65
              Uploaded By