列表

详情


NC200437. 这是最难的题

描述

PC被恶龙掳走了,作为一名王子,你并打不过恶龙,所以你需要武装你的士兵一起去战胜恶龙。
但是恶龙太强了,以至于每个士兵都得有m种不同的装备才能与掳走PC的恶龙去战斗。
现在你有n种装备,每种装备有a_i件,你想知道你最多能武装多少名士兵(不要求每个士兵装备相同,只用凑出m种不同的装备,就可以获得pc的祝福)?

输入描述

先输入一个值n,再输入一个值m,接下来一行n个数,第i个数a_i代表第i个装备的数量。

输出描述

一个整数,你能够武装的最多士兵数。

示例1

输入:

5 3
3 1 2 3 3

输出:

4

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 30ms, 内存消耗: 1672K, 提交时间: 2019-12-19 12:35:51

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

ll a[200005];
int main()
{
    ll n,k;
    scanf("%lld%lld",&n,&k);
    ll A=0;
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]),A+=a[i];
    sort(a+1,a+n+1,greater<ll>());
    ll X=0;
    for(ll w=1;w<k;w++)
    {
        X+=a[w];
        A-=a[w];
        if(X*(k-w)>w*A)X=A*w/(k-w);
    }
    ll sum=X+A;
    printf("%lld\n",sum/k);
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 35ms, 内存消耗: 2016K, 提交时间: 2020-02-24 11:31:21

#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long
int main()
{
	ll n,m,a[100010],b[100010]={0};
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)b[i]=b[i-1]+a[i];
	ll t=m;
	ll ans;
	for(int i=n;i>n-m;i--){
		if(b[i]/t>=a[i]){
			ans=b[i]/t;
			break;
		}
		else t--;
		if(i==n-m+1)ans=a[i];		
	}
	printf("%lld\n",ans);
}

上一题