列表

详情


NC215160. 跨年了,给女朋友准备啥礼物呢?

描述

跨年前夕,毛毛决定给她女朋友准备一份礼物。为了给女朋友惊喜,毛毛想制作若干个长度相同的棒棒糖。毛毛现在买了一个零食大礼包,里面有一些长度不一样的棒棒糖,他想将每根棒棒糖都掰成若干段自己想要的长度,并丢掉多余的部分。因为毛毛的手很巧,所以他掰棒棒糖不会有任何失误。也就是说,对于一根长度为n的棒棒糖,毛毛可以精准的将它们掰成若干个棒棒糖,使它们的长度之和为n。
毛毛不知道掰成多长比较好,所以干脆越长越好。不过由于毛毛有点强迫症,所以他希望长度为非负整数。保证所有棒棒糖的原长也是非负整数。那么请问毛毛最终得到的每根棒棒糖为多长呢?

输入描述

第一行两个正整数N、K,表示棒棒糖原本的根数和毛毛希望得到的棒棒糖根数。
第二行N个正整数表示每根棒棒糖的初始长度。

输出描述

输出一行一个非负整数表示每根棒棒糖的最大长度。

示例1

输入:

5 10
4 4 4 5 3

输出:

1

说明:

如果长度为2,只能得到2+2+2+2+1=9根,不够;长度为1可以得到4+4+4+5+3=20根,足够。所以答案最大是1。

示例2

输入:

5 3
1 2 3 4 5

输出:

3

原站题解

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

Java(javac 1.8) 解法, 执行用时: 372ms, 内存消耗: 55000K, 提交时间: 2020-12-21 15:33:09

import java.util.*;
public class Main {
	static long a[];
	static int n;
	static int m;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		a = new long[n];
		for (int i = 0; i < n; i++) {
			a[i] = sc.nextLong();
		}
		long l = 0, r = 1000000009,mid;
		while (l<r-1) {
			mid = (l+r)>>1;
			if(check(mid))
				l = mid;
			else {
				r = mid - 1;
			}
		}
		if (check(l+1)) {
			l++;
		}
		System.out.println(l);
	}
	public static boolean check(long x) {
		int ans = 0;
		for (int i = 0; i < n; i++) {
			ans += (a[i]/x);
		}
		return ans>=m?true:false;
	}
}

C++(clang++11) 解法, 执行用时: 22ms, 内存消耗: 744K, 提交时间: 2020-12-20 15:04:19

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

int n,k;
long num[200005];
long maxs = 0;

bool chek(long mid)
{
	long ans = 0;
	for(int i=0;i<n;i++)
		ans+=num[i]/mid;
	if(ans>=k)
		return true;
	else
		return false;
}

int main()
{
	cin>>n>>k;
	for(int i=0;i<n;i++)
		cin>>num[i];
	long l = 1,r = 1000000000;
	long mid;
	while(l<r)
	{
		mid = (l+r)/2;
		if(chek(mid))
		{
			maxs = max(maxs,mid);
			l = mid+1;
		}
		else
		{
			r = mid-1;
		}
	}
	cout<<maxs<<endl;
	return 0;
} 

上一题