列表

详情


NC19916. [CQOI2010]扑克牌

描述

你有n种牌,第i种牌的数目为ci。另外有一种特殊的牌:joker,它的数目是m。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌。比如,当n=3时,一共有4种合法的套牌:{1,2,3}, {J,2,3}, {1,J,3}, {1,2,J}。 给出n, m和ci,你的任务是组成尽量多的套牌。每张牌最多只能用在一副套牌里(可以有牌不使用)。

输入描述

第一行包含两个整数n, m,即牌的种数和joker的个数。
第二行包含n个整数ci,即每种牌的张数。

输出描述

输出仅一个整数,即最多组成的套牌数目。

示例1

输入:

3 4
1 2 3

输出:

3

说明:

样例解释
输入数据表明:一共有1个1,2个2,3个3,4个joker。最多可以组成三副套牌:{1,J,3}, {J,2,3}, {J,2,3},joker还剩一个,其余牌全部用完。

原站题解

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

C++ 解法, 执行用时: 13ms, 内存消耗: 416K, 提交时间: 2021-06-08 19:20:54

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int i,j,k,n;
ll l,r,md,a[66],sb,res;
int main(){
	scanf("%d",&n);n++;
	for(i=1;i<=n;i++){scanf("%lld",&a[i]);}
	l=0;r=1e9;
	while(l<=r){
		md=(l+r)/2;sb=0;
		for(i=1;i<=n;i++){
			sb+=max(0ll,md-a[i]);
		}
		if(sb<=md){res=max(res,md);l=md+1;}
		else{r=md-1;}
	}
	printf("%lld",res);
}

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 428K, 提交时间: 2023-01-12 11:18:30

#include<bits/stdc++.h>
long long a[100],n,m,i,l,r=INT_MAX,ans,mid,km;
signed main(){
    for(std::cin>>n>>m,i=0;i<n;++i)std::cin>>a[i];
    while(l<=r){
        for(mid=l+r>>1,km=0,i=0;i<n;++i)if(a[i]<mid)km+=mid-a[i];
        km<=m&&km<=mid?(l=mid+1,ans=mid):(r=mid-1);}
    std::cout<<ans;
    return 0;
}

Python3 解法, 执行用时: 18ms, 内存消耗: 2836K, 提交时间: 2021-06-09 00:11:46

n, m = map(int, input().split())
c = sorted(list(map(int, input().split())))
s = sum(c)
l, r = c[0], c[-1] + m + 1
while l < r:
	z, t = (l + r) // 2, 0
	for x in c:
		if x < z: t += z - x
	if t <= m and t <= z: l = z + 1
	else: r = z
print(l - 1)

上一题