2021浙江省赛 F I

news2024/10/8 21:30:09

F - Fair Distribution

题意

给定两个a,b,每次操作可以使b++或者a--,为使得b是a的倍数,最小操作次数是多少

思路

朴素版本:枚举a一直到1为止,每一次找到离b最近的a的倍数(>=b),然后每次更新一下最小操作次数是多少,时间复杂度O(n*T)

优化版本:每一个a在找到:找到离b最近的a的倍数(>=b) 的时候都会求到这个倍数(>=1),利用这个倍数可以找到满足这个倍数条件之下的最小可能的a,假设满足这个倍数的区间为[L,R],那么a取L一定是最优,因为这个倍数>=1,a如果-1那么b对应的数字就要+1×倍数,接下来求出l-1对应的倍数,然后以此类推

举个例子,假设此时输入样例为

11 19

那么通过$\lceil \frac{19}{11} \rceil=2$可以发现倍数为2,那么19在倍数为2的情况下可以使用的最小的a为$\lceil \frac{19}{2} \rceil=10$

也就是说a取\left [ 10,11 \right ]对应的倍数都为2,那么此时取10一定是最优的,更新一下答案

   可以发现取11,那么a的操作次数为0,b的操作次数为3,一共为3

                 取10的话,a的操作次数为1,b的操作次数为1,一共为2(变化趋势对应上方蓝字)

接下来a取L-1也就是9,重新计算一下可以发现$\lceil \frac{19}{9} \rceil=3$.此时最小可用的a为$\lceil \frac{19}{3} \rceil=7$

那么a取\left [ 7,9 \right ]对应的倍数都是3,那么取7一定最优,再更新一下答案

以此类推,每次更新一下答案

代码

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define u1 (u<<1)
#define u2 (u<<1|1)
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).begin(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const int N=1e6+10,INF=4e18;
int n,m;
void solve()
{
	cin>>n>>m;
	if(n>m)
	{
		cout<<n-m<<'\n';
		return;
	}
	if(m%n==0)
	{
		cout<<"0\n";
		return;
	}
	int res=INF,cnt=0;
	int bei=(m+n-1)/n;
	while(1)
	{
		cnt++;
		int now=(m+bei-1)/bei;//n最小需要达到
		if(n-now>res)break;//剪枝
		res=min(res,n-now+now*bei-m);
		if(now==1)break;
		bei=(m+now-1-1)/(now-1);
	}
	cout<<res<<'\n';
	return ;
}
signed main()
{
	IOS;
	int T=1;
	cin>>T;
	while(T--)
		solve();
	return 0;
}

I - Grammy and Ropes

 

题意

给定图中蓝色点的覆盖状态,问有多少种不同方法选择其中的几个绳子剪断(也可以不剪)使得绳子相互分离

思路


可以初步发现,绳子两两之间的状态基本上都是独立的,也就是1,2号绳子的是否相交只取决于1 4两个蓝点,1,3号绳子只取决于2 5,2,3号绳子只取决于3 6,那么把绳子的相交状态累加起来,就可以初步找到答案

后来发现wa7了,于是手撕了三个圆环又找了几种状态,发现1覆盖2,2覆盖3,3覆盖1这种情况虽然绳子两两是覆盖关系,没有相交,但是这种覆盖关系会使三个圆环缠在一起,于是在这种情况下可以选择随意选择剪一根绳子使绳子可以拉开,这里的方案是七种,详情见代码

代码

#include <map>
#include <set>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define u1 (u<<1)
#define u2 (u<<1|1)
#define pb push_back
#define pp pop_back()
#define int long long
#define laile cout<<"laile"<<endl
#define lowbit(x) ((x)&(-x))
#define double long double
#define sf(x) scanf("%lld",&x)
#define sff(x,y) scanf("%lld %lld",&x,&y)
#define sd(x) scanf("%Lf",&x)
#define sdd(x,y) scanf("%Lf %Lf",&x,&y)
#define _for(i,n) for(int i=0;i<(n);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
#define _pre(i,a,b) for(int i=(a);i>=(b);--i)
#define all(x) (x).beg`in(), (x).end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef unsigned long long ULL;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
const int N=1e6+10,INF=4e18;
int n,m;
bool bl[10];
void solve()
{
	_rep(i,1,6)
	{
		string s;
		cin>>s;
		if(s=="true")bl[i]=true;
		else bl[i]=false;
	}
	string s="";
	_rep(i,1,3)
	{
		if(bl[i])s+='1';
		else s+='0';
	}
	int a=0;
	if(bl[1]!=bl[4])a++;
	if(bl[2]!=bl[5])a++;
	if(bl[3]!=bl[6])a++;
	if(a==0)
	{
		if(s=="010"||s=="101")cout<<"7\n";//特判相互覆盖的情况{1,2,3,12,13,23,123}
		else cout<<"8\n";//答案集合{空集,1,2,3,12,13,23,123}
	}
	else if(a==1)cout<<"6\n";//假设1,2相交,答案集合{1,2,12,13,23,123}
	else if(a==2)cout<<"5\n";//假设1,2相交且1,3相交,答案集合{1,23,12,13,123}
	else cout<<"4\n";//两两相交,答案集合{12,13,23,123}
	return ;
}
signed main()
{
	IOS;
	int T=1;
//    cin>>T;
	while(T--)
		solve();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像增强论文精读笔记-Low-Light Image Enhancement via a Deep Hybrid Network

1. 论文基本信息 论文标题&#xff1a;Low-Light Image Enhancement via a Deep Hybrid Network 作者&#xff1a;Wenqi Ren等 发表时间和期刊&#xff1a;2019&#xff1b;IEEE TIP 论文链接&#xff1a;https://ieeexplore.ieee.org/document/8692732 2. 研究背景和动机 …

Linux防火墙-案例(二)snatdnat

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令&#xff0c;我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…

YOLOv11改进 ,YOLOv11改进主干网络为MobileNetV3,助力涨点

YOLOv11改进介绍 YOLOv11 跟 YOLOv8 结构差不多相似,只是作者在 YOLOv8 基础上进行了改进,我感觉 YOLOv11 训练速度更快,map和精度应该比 YOLOv8 高一些,所以我会把 YOLOv11 改进也写在本专栏里面。YOLOv11 改进,可以看往期 YOLOv8 改进主干网络教程,原理都是一样的,这…

Qt(10.8)

作业&#xff1a;完善登录界面 源文件 #include "widget.h" #include "ui_widget.h" #include<QDebug> #include<QLabel> #include<QMessageBox> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setu…

MySQL连接查询:自连接

先看我的表结构 emp表 自连接也就是把一个表看作是两个作用的表就好&#xff0c;也就是说我把emp看作员工表&#xff0c;也看做领导表 自连接 基本语法 select 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;例子1&#xff1a;查询员工 及其 所属领导的名字 select a.n…

【stm32】寄存器(stm32技术手册下载链接)

1、资料下载 RM0008_STM32F101xx,STM32F102xx,STM32F103xx,STM32F105xx和STM32F107xx单片机参考手册 | STMCU中文官网 2、代码 设置PB7 //设置PB7 #define SDA_IN() {GPIOB->CRL&0X0FFFFFFF;GPIOB->CRL|(u32)8<<28;} #define SDA_OUT() {GPIOB->…

wsl中配置cuda,pytorch,cudnn,vscode

参考链接 查看python版本 从 NVIDIA 的官网上下载 CUDA 的 pin 文件。这个文件确保 CUDA 仓库的优先级更高&#xff0c;防止与其他仓库发生冲突。 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin将下载的 cuda-wsl-u…

Python 卸载所有的包

Python 卸载所有的包 引言正文 引言 可能很少有小伙伴会遇到这个问题&#xff0c;当我们错误安装了一些包后&#xff0c;由于包之间有相互关联&#xff0c;导致一些已经安装的包无法使用&#xff0c;而由于我们已经安装了很多包&#xff0c;它们的名字我们并不完全知道&#x…

点餐小程序实战教程17角色管理

目录 1 创建API2 创建全局变量3 加载角色4 引导用户注册总结 小程序中如果有多重角色人员使用的&#xff0c;通常需要根据用户的角色来进行页面跳转。我们点餐小程序也是区分不同的用户&#xff0c;有顾客和员工的区分&#xff0c;本篇我们讲解一下如何利用API来加载用户的角色…

移除元素(算法题分享)

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xf…

使用欧拉安装ceph分布式存储,ceph的集群安装、添加主机集群和删除主机、添加osd硬盘和手动添加硬盘为osd和移除osd。

1.ceph安装 1.1 首先准备3台机子&#xff0c;配置ip&#xff0c;给每台机子添加3块硬盘,设置主机名为ceph01、ceph02、ceph03。 192.168.10.20ceph01192.168.10.21ceph02192.168.10.22ceph03 1.2 三台机子关闭防火墙&#xff0c;setenforce 0&#xff0c;添加hosts解析、配置…

【数据结构 | PTA】表

文章目录 7-1 重排链表7-2 链表去重7-3 两个有序链表序列的合并7-4 两个有序链表序列的交集 7-1 重排链表 输入格式&#xff1a; 每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数&#xff0c;即正整数N (≤105)。结点的地址是5位非负整数&#xff…

OgreNext高级材质中增加线宽,点大小,虚线模式绘制支持

修改Ogre高级材质系统,增加线宽,点大小,虚线模式,虚线参数的支持,效果如下: 需要修改的代码文件如下: 修改如下 代码文本: //范围[0.2 - 51] 0.2 * [0,255];Ogre::uint8 mLineWidth;//范围[0.5 - 127.5] 0.5 * [0, 255];Ogre::uint8 mPointSize;//虚线标记Ogre::ui…

【Redis】Redis线程模型

目录 1. Redis 是单线程的&#xff0c;还是多线程的&#xff1f;2. Redis单线程模式是怎么样的&#xff1f;Redis 单线程模式的优势Redis 单线程的局限性Redis 单线程的优化策略 3. Redis采用单线程为什么还这么快4. Redis 6.0 之前为什么使用单线程&#xff1f;5. Redis 6.0 之…

每日学习一个数据结构-图

文章目录 图基础一、图的定义二、图的相关概念三、图的分类四、图的使用场景 和图相关的算法一、图的遍历算法二、最短路径算法三、最小生成树算法四、图匹配算法五、网络流算法 图基础 一、图的定义 在数学中&#xff0c;图是描述于一组对象的结构&#xff0c;其中某些对象对…

数据结构单向链表

单向链表的转置 转置的思想&#xff1a; (1) 将头节点与当前链表断开&#xff0c;断开前保存下头节点的下一个节点&#xff0c;保证后面链表能找得到&#xff0c;定义一个q保存头节点的下一个节点&#xff0c;断开后前面相当于一个空的链表&#xff0c;后面是一个无头的单向链表…

动态内存管理练习题的反汇编代码分析(底层)

1.C语言代码 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str NULL;str GetMemory();printf(str); }int main() {Test();return 0; } 2.反汇编代码 VS2022x64debug #include <stdio.h>…

给普通的div或者view等元素添加onblur事件的方式

一般只有input元素有blur事件&#xff0c;但是如果想给普通的元素设置了blur事件之后&#xff0c;它是不会正常直行的。还需要再给元素添加tabindex属性&#xff0c;设置了tabindex属性之后&#xff0c;元素会带有一个下划线&#xff0c;还要去掉下划线&#xff0c;而且聚焦的时…

PostgreSQL学习笔记二:PostgreSQL的系统架构

PostgreSQL 是一种功能强大的开源关系型数据库管理系统&#xff0c;其架构具有以下特点&#xff1a; 一、客户端/服务器架构 客户端 客户端可以是各种应用程序&#xff0c;如 Web 应用、桌面应用等&#xff0c;它们通过网络连接与 PostgreSQL 服务器进行通信。客户端使用标准的…

力扣之603.连续空余座位

文章目录 1. 603.连续空余座位1.1 题干1.2 准备数据1.3 思路分析1.4 解法1.5 结果截图 1. 603.连续空余座位 1.1 题干 表: Cinema ----------------- | Column Name | Type | ----------------- | seat_id | int | | free | bool | ----------------- Seat_id 是该表的自动递…