Codeforces Round 975 (Div. 2) C. Cards Partition

news/2024/9/29 4:44:13 标签: 算法, c++, 数据结构

题目链接:题目

大意:

给出若干种卡片,每种卡片有一定数量,你可以加入不超过 k k k张任意已给出种类的卡片,使得它们可以被分成若干组,每组容量一定,且同组内不存在相同种类的卡片,求出最大能成立的容量。

思路:

这题的两个关键点在于,一找到可以分配成功的条件,二正确处理各种变量的关系。
这个条件乍一看有点复杂,单看每一组不知道要装什么数字,那么先关注一些必要条件,首先所有卡片的总和要整除每组的容量,并且每种卡片的卡牌数量都不能超过组数,否则由于抽屉原理,肯定会存在有卡片没地方装,被迫和自己兄弟挤在一起。这时候你发现这些就是充分条件,想象你把每种卡片尽可能地放在不同组中,一层层地放满后,一定能够成立,不会有冲突。
接着我们得到条件就是 s u m % l = 0 sum\%l=0 sum%l=0且单种卡片最大数量 m a x < = s u m / l max<=sum/l max<=sum/l,如何把 k k k加入其中呢?请看代码。
(一开始不敢写是因为以为卡片数量总和超过long long,后来发现最多可能也就到1e16,long long是9e18)

代码:

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

#define int long long
#define MOD 1000000007
#define fi first
#define se second
#define pii pair<int,int>
#define vec vector

void solve(){
    int n, k;
    cin >> n >> k;
    vec<int> a(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    int mx = *max_element(a.begin(), a.end());
    int sum = accumulate(a.begin(), a.end(), 0ll);
    int ans = 0;
    for(int l = n; l >= 1; l--){
        if(sum % l == 0 && mx * l <= sum + (k / l) * l){
            ans = l;
            break;
        }
        if(l - (sum % l) <= k && mx * l <= (sum + l - (sum % l)) + ((k - (l - (sum % l))) / l) * l){
            ans = l;
            break;
        }
    }
    cout << ans << '\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin >> t;
    while(t--){
        solve();
    }
    return 0;
}   

http://www.niftyadmin.cn/n/5682394.html

相关文章

6--苍穹外卖-SpringBoot项目中菜品管理 详解(二)

目录 菜品分页查询 需求分析和设计 代码开发 设计DTO类 设计VO类 Controller层 Service层接口 Service层实现类 Mapper层 功能测试 删除菜品 需求设计和分析 代码开发 Controller层 Service层接口 Service层实现类 Mapper层 功能测试 修改菜品 需求分析和设…

Docker 容器日志记录与管理:日志输出、轮转与配置实践

Docker 容器化应用的日志管理是运维中的重要环节。容器默认会将标准输出(stdout)和标准错误(stderr)记录到日志文件中,但这些日志文件如果不加管理,可能会无限制地增长,最终导致磁盘空间耗尽。因此,了解如何规范化容器日志管理、配置日志轮转策略以及合理存储位置至关重…

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文&#xff5c;部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…

比较器(算法中排序)

方式一&#xff1a;不常用 让实体类实现Comparable接口&#xff0c;泛型是需要比较的类型&#xff0c;同时重写compareTo方法 缺点&#xff1a;对代码有侵入性。 public class Student implements Comparable<Student> {private String name;private double score;// …

【JAVA-数据结构】初识集合框架

时隔几个月&#xff0c;小主又回来了&#xff0c;近期我们来谈谈数据结构相关内容&#xff0c;这部分数据结构&#xff0c;我们将使用JAVA进行相关讲解&#xff0c;感兴趣的小伙伴持续关注&#xff0c;防止走丢。 1. 什么是集合框架 Java 集合框架 Java Collection Framework &…

在公司网络环境下,无法访问公共网络时,可在插件端配置网络代理后使用通义灵码

在公司网络环境下&#xff0c;无法访问公共网络时&#xff0c;可在插件端配置网络代理后使用通义灵码。 通义灵码插件下载&#xff1a;通义灵码_智能编码助手_AI编程-阿里云 配置网络代理 公司网络通常使用 HTTP 代理服务器在网络流量发送到目标位置之前进行拦截&#xff0c;以…

Qt C++设计模式->享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享相同对象来减少内存使用&#xff0c;尤其适合在大量重复对象的情况下。它通过将对象的可共享部分抽取出来&#xff0c;并在多个上下文中共享&#xff0c;从而避免对象的多次创建…

老古董Lisp实用主义入门教程(12):白日梦先生的白日梦

白日梦先生的白日梦 白日梦先生已经跟着大家一起学Lisp长达两个月零五天&#xff01; 001 粗鲁先生Lisp再出发002 懒惰先生的Lisp开发流程003 颠倒先生的数学表达式004 完美先生的完美Lisp005 好奇先生用Lisp来探索Lisp006 好奇先生在Lisp的花园里挖呀挖呀挖007 挑剔先生给出…