Codeforces Round 889 (Div. 2) (C1~C2)

掉大分,C1被sb错误困扰。
提示如果C1会了但不会C2,也应该先将C1解法看一遍

C1 Dual (Easy Version)

题意

给定长度为 n n n 的数组 a a a,( n < = 20 , − 20 < = a i < = 20 n<=20,-20<=a_i<=20 n<=2020<=ai<=20),每次操作可以任选 i , j i, j i,j,使得 a i = a i + a j a_i = a_i + a_j ai=ai+aj i i i 可以等于 j j j)。问最多 50 50 50 次操作以内如何将给定数组变成非降序。

思路

以下出现的 c1,c2等都代表执行操作的次数 c1代表执行一次,以此类推。
简单版本给了 50 50 50 次操作机会理应是好想的,假如现在告诉你数组数字全都是非负数或者都是负数,是否能在 19 19 19 次操作以内将其变成非降序。方法是很好想到的,如果全是正数就从前往后累加一遍,负数就从后往前累加一遍即可。

for(int i = 2; i <= n; i ++){ // 全是非负数累加一次 c19  c10 + c19 = c29ans.push_back({i, i - 1});
}
for(int i = n - 1; i >= 1; i --){ // 累加 c19   c12 + c19 = c31ans.push_back({i, i + 1});
}

那么现在问题变成如何将数组变成全部非负或全负,这个问题也很好实现,如果最小负数 + + + 最大正数 > = 0 >=0 >=0 ,那么我们将所有负数加上最大正数不就可以了吗,反之亦然。这个操作的次数同样不会超过 20 20 20 次。
19 + 19 = 38 < 50 19 + 19 = 38 < 50 19+19=38<50 解法成立。
博主写题的时候犯蠢没想到这个,写了个有点麻烦的写法,还写错了找了一小时bug,真逆天。

解法较为简单,代码就不放了,想看的可以参考一下C2的代码。

C2 Dual (Hard Version)

题意

和C1唯一的区别是,要求操作数在 31 31 31 次以内。

思路

思路继承自C1解法,使用了分类的讨论的方法,码量虽然有点大,但较为容易理解都是判断语句,并且在代码中有详细注释,直接看代码即可。

代码

#include <bits/stdc++.h>
using namespace std;#define ll long long
// const int N = 2e5 + 10;int a[100];
struct node{int b, id;bool operator < (const node &A)const{return b < A.b; // 按大小排序}
}s[100];
void solve(){int n;cin >> n;int sum1 = 0, sum2 = 0; // 记录负数和正数的数量for(int i = 1; i <= n; i ++){cin >> a[i];if(a[i] < 0) sum1 ++;else sum2 ++;s[i] = {a[i], i};}sort(s + 1, s + 1 + n);if(sum1 == 0 && sum2 == 0){ // 全0cout << "0\n";return ;}   vector<pair<int, int>> ans;// 以下出现的 c1,c2等都代表执行操作的次数 c1代表执行一次,以此类推if(sum2 >= sum1){ // 正数数量 >= 负数if(s[1].b + s[n].b >= 0){ // 最小负数 + 最大正数 >= 0 那么先将负数变成非负 <= c10 for(int i = 1; i <= n; i ++){if(a[i] < 0) ans.push_back({i, s[n].id});}for(int i = 2; i <= n; i ++){ // 全是非负数累加一次 c19  c10 + c19 = c29ans.push_back({i, i - 1});}}else { // 最小负数 + 最大正数 < 0if(sum2 <= 12){for(int i = 1; i <= n; i ++){ // 将所有正数变成负数 <= c12if(a[i] > 0) ans.push_back({i, s[1].id});}for(int i = n - 1; i >= 1; i --){ // 累加 c19   c12 + c19 = c31ans.push_back({i, i + 1});}}else{ // 正数数量 >= 13 负数数量 <= 7for(int i = 1; i <= 5; i ++){ // 将最大的正数翻倍c5次 就算是1 5次后也等于 32  最小负数-20 相加为正数ans.push_back({s[n].id, s[n].id});}for(int i = 1; i <= n; i ++){ // 将所有负数变成正数 <= c7if(a[i] < 0) ans.push_back({i, s[n].id});}for(int i = 2; i <= n; i ++){ans.push_back({i, i - 1}); // 累加 c19  c5 + c7 + c19 = c31}}}}else{ // 一样的思路if(s[1].b + s[n].b <= 0){ // 最小负数 + 最大正数 <= 0 那么先将正数变非正 <= c10 for(int i = 1; i <= n; i ++){if(a[i] > 0) ans.push_back({i, s[1].id});}for(int i = n - 1; i >= 1; i --){ // 全是非正数累加一次 c19  c10 + c19 = c29ans.push_back({i, i + 1});}}else { // 最小负数 + 最大正数 > 0if(sum1 <= 12){for(int i = 1; i <= n; i ++){ // 将所有负数变成正数 <= c12if(a[i] < 0) ans.push_back({i, s[n].id});}for(int i = 2; i <= n; i ++){ // 累加 c19   c12 + c19 = c31ans.push_back({i, i - 1});}}else{ // 负数数量 >= 13 正数数量 <= 7for(int i = 1; i <= 5; i ++){ // 将最小的负数翻倍c5次 就算是-1 5次后也等于 -32  最大正数20 相加为负数ans.push_back({s[1].id, s[1].id});}for(int i = 1; i <= n; i ++){ // 将所有正数变成负数 <= c7if(a[i] > 0) ans.push_back({i, s[1].id});}for(int i = n - 1; i >= 1; i --){ans.push_back({i, i + 1}); // 累加 c19  c5 + c7 + c19 = c31}}}}cout << (int)ans.size() << "\n";for(auto [i, j] : ans){cout << i << " " << j << "\n";}
}int main(){ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int t;cin >> t;while(t --){solve();}return 0;
}

D Earn or Unlock (待补)

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

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

相关文章

KY222 打印日期+KY111日期差值

一、KY222题目 二、代码 #include <climits> #include <iostream> using namespace std; class Date{public:Date(int year 1,int month 2,int day 3){_year year;_month month;_day day;}int GetDay(int year ,int month);void Define(int n);public:int _yea…

查看进程方式

目录 ps top uptime pstree ps 查看静态的进程统计信息 top 实时显示系统中各个进程的资源占用情况 第一行 top - 17:00:23 up 15 min, 1 user, load average: 1.05, 1.22, 0.98 17:00:23————当前时间 up 15 min————系统运行时间 1 user————当前登录用户数…

陪诊小程序软件|陪诊系统定制|医院陪诊小程序

开发一个陪诊小程序需要投入一定的费用&#xff0c;具体金额会因项目的复杂程度、功能需求和推广政策而有所差异在投入资金之前&#xff0c;建议进行市场调研和需求分析&#xff0c;制定出合理的预算&#xff0c;并选择专业的开发团队进行合作&#xff0c;那么开发陪诊小程序需…

django模板继承和组件了解

1、模板继承 什么时候需要用到模板呢&#xff0c;比如我们在开发的页面的导航栏&#xff0c;你点不同的功能页面这个导航栏都是一样的&#xff0c;如果每个页面都要加上这个导航条会写重复代码&#xff0c;而且如果导航条有变化&#xff0c;每个页面都要修改&#xff0c;这个是…

linux虚拟机开机后桌面显示CentOS-7.5-x86盘片文件,并且无法远程连接虚拟机?

在虚拟机启动后遇到了显示CentOS-7.5-x86光盘片文件的问题&#xff0c;并且无法远程连接到虚拟机&#xff0c;有几个可能的解决方法&#xff1a; 检查虚拟机设置&#xff1a;确保虚拟机的网络适配器已正确配置&#xff0c;并且虚拟机配置的网络选项是桥接模式或 NAT 模式&#…

2023大同首届信息技术产业峰会举行,共话数字经济新未来

7月28日&#xff0c;“聚势而强共领信创”2023大同首届信息技术产业峰会圆满举行。本次峰会由中共大同市委、大同市人民政府主办&#xff0c;中国高科技产业化研究会国际交流合作中心、山西省信创协会协办&#xff0c;中共大同市云冈区委、大同市云冈区人民政府、诚迈科技&…

密码学的一些常识

1&#xff0c;对称密码、公钥密码、消息认证、数字签名的对比 对称密码公钥密码发送者共享秘钥加密公钥加密接收者共享秘钥解密私钥解密秘钥配送问题存在不存在&#xff0c;但需要CA认证公钥机密性√√ 消息认证数字签名发送者共享秘钥计算MAC使用私钥对文本HASH值做签名接收者…

在Spring Boot中打印SQL语句的方法

系列文章目录 文章目录 系列文章目录前言一、使用Spring Boot的配置选项打印SQL语句二、 使用Logback配置打印SQL语句三、 使用Druid数据源打印SQL语句四、 使用Log4j2打印SQL语句五、 使用@EventListener监听SQL语句总结前言 在Spring Boot项目中,调试和优化数据库操作是很常…

微积分物理题(原创)

在一个粗糙的平面上&#xff0c;有一个质量为 1 kg 1\text{kg} 1kg的小木块&#xff0c;小木块的初速度为 0 0 0&#xff0c;小木块与平面的动摩擦因数 μ 0.2 \mu0.2 μ0.2。有一个拉力 F F F拉动小木块从左往右移动&#xff0c;拉力 F F F与时间 t t t的关系为 F 0.3 t 2 −…

ES6 新特性(详细复习笔记)--下

文章目录 ES6 新特性(详细复习笔记)-下对象相关新特性1. 需求: 演示声明对象简写2-需求: 演示对象方法简写3-应用实例-对象拓展运算符 注意事项和使用细节箭头函数基本介绍应用实例 1-箭头函数使用应用实例 2-箭头函数使用应用实例 3-箭头函数对象解构 注意事项和使用细节综合代…

打卡力扣题目五

#左耳听风 ARST 打卡活动重启# 目录 一、问题 二、解题方法一 三、解题方法二 四、两种方法的区别 关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个…

Jgit 工具类 (代码检出、删除分支(本地、远程)、新建分支、切换分支、代码提交)

https://blog.csdn.net/qq_37203082/article/details/120327084 Jgit 工具类 (代码检出、删除分支&#xff08;本地、远程&#xff09;、新建分支、切换分支、代码提交)_jgit删除远程分支_CJ点的博客-CSDN博客 <!--JAVA操作GIT--><dependency><groupId>org.…

JavaScript学习 -- SM3算法基本原理

SM3算法是一种由国家密码管理局发布的哈希算法&#xff0c;被广泛用于数字签名和消息认证等应用中。在JavaScript中&#xff0c;我们可以使用第三方库来计算数据的SM3哈希值。本篇文章将介绍SM3算法的基本原理和相关技术&#xff0c;并提供一些实例来演示如何在JavaScript中使用…

vue3 中模板字符串中添加click方法并传参

工作中遇到html字符串拼接出dom结构&#xff0c;并且需要触发事件和传参的场景。借此机会记录一下。 1. 拼接内容 核心是利用html的onClick属性&#xff0c;触发单击事件&#xff0c;想要传递对象&#xff0c;必须要JSON.stringify()&#xff0c;否则控制台会报错 // 传递对象…

DAY14_FilterListenerAjaxAxiosJsonfastjson综合案例-axios和html交互

目录 1 Filter1.1 Filter概述1.2 Filter快速入门1.2.1 开发步骤1.2.2 代码演示 1.3 Filter执行流程1.4 Filter拦截路径配置1.5 过滤器链1.5.1 概述1.5.2 代码演示1.5.3 问题 1.6 案例1.6.1 需求1.6.2 分析1.6.3 代码实现1.6.3.1 创建Filter1.6.3.2 编写逻辑代码1.6.3.3 测试并抛…

ERROR in unable to locate ‘***/public/**/*‘ glob

前提 自己搭了一个react项目的脚手架&#xff0c;npm包下载一切都很正常&#xff0c;启动的时候突然就报ERROR in unable to locate ***/public/**/* glob这个错误&#xff0c;根据百度分析了一下产生的原因&#xff1a;webpack配置文件中的CopyWebpackPlugin导致的 网上给出的…

【idea工具】idea工具,build的时候提示:程序包 com.xxx.xx不存在的错误

idea工具&#xff0c;build的时候提示:程序包 com.xxx.xx不存在的错误&#xff0c;如下图&#xff0c;折腾了好一会&#xff0c; 做了如下操作还是不行&#xff0c;idea工具编译的时候&#xff0c;还是提示 程序包不存在。 a. idea中&#xff0c;重新导入项目&#xff0c;也还…

Vue+axios如何解决跨域

1、为什么会产生跨域&#xff1f; 出于浏览器的同源策略限制。 同源策略&#xff08;Sameoriginpolicy&#xff09;是一种约定&#xff0c;是浏览器的一种安全机…

从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解&#xff0c;用于处理应用程序中的异常。当应用程序中发生异常时&#xff0c;ExceptionHandler将优先地拦截异常并处理它&#xff0c;然后将处理结果返回到前端。该注解可用于类级别和方法级别&#xff0c;…

苍穹外卖心得与总结【对比瑞吉】【如何获得铁粉】

对于苍穹外卖项目&#xff0c;从学习课程加复习已经13天了。 对于一名已经学习过SSMLinuxRedis数据库的Java练习生来说&#xff0c;这个项目相对于之前学习的《瑞吉外卖》新增了很多功能和技术&#xff0c;是很值得练手和提升的课程&#xff0c;下面给出自己的一些见解。&#…