列表

详情


NC205725. L1-6分鸽子

描述

鸽子这么可爱,请多放点儿香菜!
劳动节快要到了,Reverie想要把一些鸽子分给协会里的小伙伴。她有 n 只重量不同的鸽子,要分给 m 个小伙伴。每个小伙伴分到的鸽子肉重量要相等,并且都是非负整数。一个人分到的鸽子肉不能来自于两只及以上的鸽子,因为这样会串味儿。
请你帮Reverie计算一下,每个小伙伴最多能分到多少鸽子肉。

输入描述

第一行两个正整数 n, m,分别表示鸽子的数量和小伙伴的数量。
第二行 n 个正整数,表示 n 只鸽子的重量。

输出描述

一行内输出一个非负整数,表示每个小伙伴分到的鸽子肉重量。

示例1

输入:

3 5
3 4 7

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 60ms, 内存消耗: 2156K, 提交时间: 2020-07-30 13:08:51

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll n,m,a[100010],ans=0;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>a[i];
		ans+=a[i];
	}
	ll l=1,r=ans/m;
	while(l<=r){
		ll mid=(l+r)>>1;
		ll cnt=0;
		for(int i=0;i<n;i++){
			cnt+=a[i]/mid;
		}
		if(cnt>=m){
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	cout<<r<<endl;
} 

C++11(clang++ 3.9) 解法, 执行用时: 29ms, 内存消耗: 852K, 提交时间: 2020-07-02 22:14:40

#include<bits/stdc++.h>
using namespace std;

int a[100005];
int main()
{
	int i,j,n,m,l,r,mid,ans;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)scanf("%d",&a[i]);
	for(l=1,r=1e9;l<=r;)
	{
		mid=(l+r)>>1;
		for(i=j=0;j<m&&i<n;i++)j+=a[i]/mid;
		if(j>=m)ans=mid,l=mid+1;
		else r=mid-1;
	}
	printf("%d\n",ans);
    return 0;
}

上一题