NC19916. [CQOI2010]扑克牌
描述
输入描述
第一行包含两个整数n, m,即牌的种数和joker的个数。第二行包含n个整数ci,即每种牌的张数。
输出描述
输出仅一个整数,即最多组成的套牌数目。
示例1
输入:
3 4 1 2 3
输出:
3
说明:
样例解释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)