Atcoder Beginner Contest 044

2023-11-01

C.C - Tak and Cards

我一开始想的是先从小到大排个序,然后分情况,先从左往右一个数一个数枚举,如果等于ave*1,就res++,如果大于ave*1,就说明1个数的没有了,然后从左到右两个数两个数枚举,如果等于ave*2,就res++,如果大于ave*2,就说明两个数的没有了,以此类推

但是忽略了不一定非得相邻的两个数相加,这个思路漏洞很大,不能采用

实际上,像这种平均数的问题,可以所有数都减去一个平均数,然后在这些数里选择,加起来等于0的,那么它们的原始数的平均数就是该平均数,这里暂且先不这么做 

有限制的选择,背包问题

f[i][j][k]表示从前i张卡片中选,选择j张,总和是k的方案数

状态转移:在前i张卡片中选,选择j张,总和是k的方案数可以是选i与不选i的方案数总和

不选i,在前i-1张中选,选择j张,总和为k;

选i,在前i-1张中选,选择j-1张,总和为k-a[i] 

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 110;
LL a[N];
LL f[N][N][3000];
LL res;
int main()
{
    int n,ave;
    cin >> n >> ave;
    for (int i = 1; i <= n; i++) cin >> a[i];
    f[0][0][0] = 1;//f[0][0][0]=1是因为这一状态用于转移到后面的状态,如果由这一状态转移,肯定要加1的,不可能加0
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= i;j++ ) {
            for (int k = 0; k <=2500; k++) {
                f[i][j][k] += f[i - 1][j][k];
                if (k - a[i] >= 0 && j >= 1) f[i][j][k] += f[i - 1][j - 1][k - a[i]];
            }
        }
    }
    for (int j = 1; j <= n; j++) {
        res += f[n][j][j*ave];
    }
    cout << res << endl;
    return 0;
}

D.D - Digit Sum 

题意:将n转化成b进制,然后对每一位求和,看是否等于s 

分类:

1.s等于n,b=n+1

2.s大于n,无解

3.s小于n

a0*b^0+a1*b^1+...+ak*b^k=n

a0+a1+...+ak=s

当k>=2时,b<=sqrt(n),暴力枚举即可

当k=1时,b>sqrt(n),a0*b^0+a1*b^1=n==>a0+a1*b=n

a0+a1=s

所以b=(n-s)/a1+1,因为a1<b,所以a1<=sqrt(n-s)

接着只需要枚举 n - s 的合法性判断是否存在即可

注意合法性判断既要满足 x1,x2 大于等于 0,也要小于 b(x1,x2即n在b进制下第一位和第二位)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
int n, s;
bool check(int x) {
    int res = 0;
    int m = n;
    while (m) {
        res += m % x;
        m /= x;
    }
    return res == s;
}
signed main()
{
    cin >> n >> s;
    int sum;
    if (s == n) {
        cout << n + 1 << endl;
        return 0;
    }
    if (s > n) {
        cout << -1 << endl;
        return 0;
    }
    for (int i = 2; i <= n/i; i++) {
        if (check(i)){
            cout << i << endl;
            return 0;
        }
    }
    int ans = 1e18;
    int k = n - s;
    for (int i = 1; i<=k/i; i++) {
        if(k%i==0){
            int b = k / i + 1, x0 = s - i;
            if (b >= n / b && x0 >= 0 && x0 < b &&i<b&& b >= 2) {
                ans = min(ans, b);
            }
        }
    }
    if (ans != 1e18) cout << ans << endl;
    else cout << -1 << endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Atcoder Beginner Contest 044 的相关文章

随机推荐

  • 利用huggingface-transformers进行命名实体识别

    利用huggingface transformers进行命名实体识别 项目地址 https github com huggingface transformers 文档地址 https huggingface co docs transfo
  • linux /home recovering journal,启动Ubuntu时出现 /dev/sda2 clean 和 /dev/sda2 recovering journal 现象的解决办法...

    最近在Ubuntu 18 4上安装Nvidia显卡后 显卡似乎总是不能完全兼容 第一次出现问题时 是登录账号后 发现系统采用了默认显卡驱动 而已装过的显卡驱动则有损坏导致无法使用 第二次出现问题时 则是在开机启动后 界面出现了 dev sd
  • 总结一下m3u8格式相关问题

    1 m3u8格式解读 本小节摘自 m3u8视频文件详解 m3u8不是一种视频格式 而是一种纯文本文件 m3u8视频文件格式中 存放了视频的基本信息 和 分段视频的索引地址 将一整个视频分成了时长不同的很多小段 当播放m3u8视频时 就是按顺
  • 微信小程序发布新版本后使用时自动提示用户更新或自动更新的方法

    如图 当小程序发布新的版本后 用户如果之前访问过该小程序 通过已打开的小程序进入 未手动删除 则会弹出这个提示 提醒用户更新新的版本 用户点击确定就可以自动重启更新 点击取消则关闭弹窗 不再更新 const updateManager wx
  • 关于C++编程vs2017 error: c2228的一种可能,或称基类位于派生类之后会出现的问题

    上次C 实验编程遇到了一次error c2228的问题 百度过了也没有答案 最终调换了基类和派生类的顺序才得到解决 下面是产生异常的一段代码 以上省略基类Plane和其纯虚函数area和girth class Triangle public
  • 论文总结:基于深度学习的图像风格迁移研究

    基于深度学习的图像风格迁移研究 前言 图像风格迁移方法 基于图像迭代的图像风格迁移方法 基于模型迭代的图像风格迁移方法 卷积神经网络 生成对抗网络 CycleGAN 前言 什么是深度学习 深度学习是机器学习的一种 机器学习是研究人工智能的必
  • 【C++基础】7. 控制语句

    文章目录 1 循环 1 1 循环类型 1 2 循环控制语句 break 语句 continue 语句 goto 语句 1 3 无限循环 2 选择 switch 语句 语句 1 循环 1 1 循环类型 循环类型 描述 while 循环 当给定
  • 解决ajax请求中Session失效问题

    之前项目都是jsp页面 没有遇到ajax请求中Session失效的问题 但最近的新项目中 所用框架为Jquery bootstrap html 页面所有请求都为ajax 一番尝试后 解决方法如下 1 LoginFilter中加入ajax请求
  • centos彻底删除文件夹、文件命令(centos 新建、删除、移动、复制等命令)

    centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 1 新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下
  • spring的定时任务@Scheduled简单实用

    方式一 使用注解 Component EnableScheduling 可以在启动类上注解也可以在当前文件 public class TestJob Scheduled cron 0 10 public void runfirst Syst
  • 正则表达式匹配不包含某些字符串的技巧

    经常我们会遇到想找出不包含某个字符串的文本 程序员最容易想到的是在正则表达式里使用 hede 来过滤 hede 字串 但这种写法是错误的 我们可以这样写 hede 但这样的正则表达式完全是另外一个意思 它的意思是字符串里不能包含 h e d
  • 【深度学习】 Python 和 NumPy 系列教程(廿五):Matplotlib详解:3、多子图和布局:subplot()函数

    目录 一 前言 二 实验环境 三 Matplotlib详解 1 2d绘图类型 2 3d绘图类型 3 多子图和布局 1 subplot 函数 简单示例 一 前言 Python是一种高级编程语言 由Guido van Rossum于1991年创
  • Blender安装Babylon插件

    参考链接 https doc babylonjs com extensions Exporters Blender 安装步骤图示 首先去这个网站下载此文件 https github com BabylonJS BlenderExporter
  • 区块链安全————区块链技术安全讨论

    0x00 背景介绍 区块链技术是金融科技 Fintech 领域的一项重要技术创新 作为分布式记账 Distributed Ledger Technology DLT 平台的核心技术 区块链被认为在金融 征信 物联网 经济贸易结算 资产管理等
  • 浏览器出现无法访问此页面的提示的解决办法

    部分地区与网络会出现该问题 本人查询论坛后找到的有效解决办法为 控制面板 网络和internet internet选项 连接 局域网设置 在 为LAN使用代理服务器 这一栏打上勾 点击应用退出 刷新一下就可以 下来也有可能是hosts文件里
  • Kotlin高阶函数概念

    一 高阶函数的基本概念 1 传入或者返回函数的函数 传入是函数 返回也是函数 2 函数引用最常见的方式 println 3 带有接收者Receiver的引用pdfPrinter println 二 看一下入门的例子 package net
  • 腾讯员工收入曝光,我顿悟了一个成人世界的残酷事实

    最近 一张腾讯员工的收入证明火了 收入证明上显示 这位员工的职位是腾讯 成都 某游戏客户端开发 已入职9年 而在他的税后年收入那一栏 显示着251多万元 包括工资 奖金和津贴等 平均月收入约20万 算下来 税前大概是450万 这张图在网上流
  • android壁纸显示逻辑

    所有文章仅限自己备忘 并无他用 壁纸主要分为两类 锁屏壁纸和桌面壁纸 一 壁纸服务的启动 壁纸服务WallpaperManagerService中 有一个内部类LifeCycle继承自SystemService SystemServer在启
  • 数据结构——C++中实现栈链(含完整代码)

    栈链相关代码 1 向栈顶插入元素 2 删除栈顶元素 3 判断栈是否为空 4 读取栈顶元素 0 退出程序 栈其实就是一个特殊的线性表 输入输出只能在一端 基于这一特性完成栈链的相关操作 注意事项 由于插入和删除操作只可以在一端 链表头部 所以
  • Atcoder Beginner Contest 044

    C C Tak and Cards 我一开始想的是先从小到大排个序 然后分情况 先从左往右一个数一个数枚举 如果等于ave 1 就res 如果大于ave 1 就说明1个数的没有了 然后从左到右两个数两个数枚举 如果等于ave 2 就res