蓝桥云课题目题解:“卡牌“”

小明试图用他的卡牌和空白牌凑成完整的套牌,每种卡牌至少一张。他有n种卡牌,每种的现有数量为a_i,并且每种卡牌最多可以手写b_i张。目标是找到最大可能的套牌数。通过计算和排序,确定如何使用空白牌以最大化套牌数量。
摘要由CSDN通过智能技术生成

问题描述

这天, 小明在整理他的卡牌。

他一共有 nn 种卡牌, 第 ii 种卡牌上印有正整数数 i(i \in[1, n])i(i∈[1,n]), 且第 ii 种卡牌 现有 a_{i}ai​ 张。

而如果有 nn 张卡牌, 其中每种卡牌各一张, 那么这 nn 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌, 拿出了 mm 张空白牌, 他可以在上面写上数 ii, 将其当做第 ii 种牌来凑出套牌。然而小明觉得手写的牌不太美观, 决定第 ii 种牌最多手写 b_{i}bi​ 张。

请问小明最多能凑出多少套牌?

输入格式

输入共 3 行, 第一行为两个正整数 n, mn,m 。

第二行为 nn 个正整数 a_{1}, a_{2}, \ldots, a_{n}a1​,a2​,…,an​ 。

第三行为 nn 个正整数 b_{1}, b_{2}, \ldots, b_{n}b1​,b2​,…,bn​ 。

输出格式

一行, 一个整数表示答案。

样例输入

4 5
1 2 3 4
5 5 5 5

样例输出

3

样例说明

这 5 张空白牌中, 拿 2 张写 1 , 拿 1 张写 2 , 这样每种牌的牌数就变为了 3,3,3,43,3,3,4, 可以凑出 3 套牌, 剩下 2 张空白牌不能再帮助小明凑出一套。

评测用例规模与约定

对于 30 \%30% 的数据, 保证 n \leq 2000n≤2000;

对于 100 \%100% 的数据, 保证 n \leq 2 \times 10^{5} ; a_{i}, b_{i} \leq 2 n ; m \leq n^{2}n≤2×105;ai​,bi​≤2n;m≤n2 。

思路:(我自己也不懂说,哈哈)

代码实现:

#include<bits/stdc++.h>
using namespace std;
long long n,m;//m要变成long long我靠
//题目用到了sum,所以得定义long long
int a[300010];
int b[300010];
int sum[300010];
int main(){
  cin>>n>>m;
  for(int i=0;i<n;i++)cin>>a[i];//1 2 3 4
  long long sumb=0,Sum=0;//sumb存b的总和,Sum存a+b的总和
  for(int i=0;i<n;i++){
    cin>>b[i];//5 5 5 5
    sum[i]=a[i]+b[i];//6 7 8 9
    sumb+=b[i];//20
    Sum+=sum[i];//30
  }
  sort(sum,sum+n);
  long long more=sumb-m;//20-5=15,多余的牌数,要删去 
  long long temp=Sum-n*sum[0];//30-4*6=6,每个数比最小数多了多少,加起来 
  if(more<=temp){//不会减到影响最小值sum[0]
    cout<<sum[0];
    return 0;
  }
  else{
    more=more-temp;//15-6=9
    long long cut=(more+n)/n;//还需要减去的部分 
    cout<<sum[0]-cut;
  }
} 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值