Codeforces Round 893 (Div. 2)ABC

news2024/11/26 16:58:28

Codeforces Round 892 (Div. 2)

目录

  • A. United We Stand
    • 题目大意
    • 思路
    • 代码
  • B. Olya and Game with Arrays
    • 题目大意
    • 思路
    • 代码
  • C. Another Permutation Problem
    • 题目大意
    • 思路
    • 代码

A. United We Stand

在这里插入图片描述

题目大意

给你一个数组,把这个数组分成两个数组a和b,使得数组a任意一个数都不是数组b内任意一个数的倍数
翻译:

给定一个长度为n的数组a,包含整数。并且有两个初始为空的数组b和c。您需要将数组a的每个元素恰好添加到数组b或c中的一个,以满足以下条件:

数组b和c都是非空的。更正式地说,设lb为数组b的长度,lc为数组c的长度,则lb,lc≥1。对于任意两个指标i
j(1≤i≤lb,1≤j≤lc) cj不是bi的约数。输出可查询到的数组b和c,如果不存在则输出−1。

输入 每个测试由多个测试用例组成。第一行包含一个整数t(1≤t≤500)——测试用例的数量。下面是测试用例的描述。

每个测试用例的第一行包含一个整数n(2≤n≤100)-数组a的长度。

每个测试用例的第二行包含n个整数a1,a2,…,an(1≤ai≤109)-数组a的元素。

输出 对于每个测试用例,如果不存在解决方案,则输出单个整数−1。

否则,在第一行中,分别输出两个整数lb和lc——数组波段c的长度。

在第二行中,输出lb整数b1,b2,…,bl——数组b的元素。

在第三行中,输出lc个整数c1,c2,…,cl——数组c的元素。

如果有多个解,输出其中任何一个。您可以以任何顺序输出数组中的元素。

思路

对于这一个数组,除了最大的数本身,其他的数都不会是最大的数的倍数,所以直接把最大的数放到数组b,其他的数放到数组a,需要进行特判,如果所有的数一样,也就是说最大的数否放到数组b之后数组a没有数字,此时不存在解输出“-1”

代码

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int a[110]={0};
        for(int i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
        }
        int maxzhi=INT_MIN;
        for(int i=0;i<n;++i)
        {
            maxzhi=max(maxzhi,a[i]);
        }
        vector<int>b,c;
        for(int i=0;i<n;++i)
            if(a[i]==maxzhi)c.push_back(a[i]);
        else b.push_back(a[i]);
        if(b.size()==0)printf("-1\n");
        else
        {
            printf("%d %d\n",b.size(),c.size());
            for(int i=0;i<b.size();++i)
                printf("%d ",b[i]);
            printf("\n");
            for(int i=0;i<c.size();++i)
                printf("%d ",c[i]);
            printf("\n");
        }
    }
    return 0;
}
 

B. Olya and Game with Arrays

在这里插入图片描述

题目大意

给你若干的数组,每一个数组里面至少会有两个数,现在对每一个数组都进行一次操作或者是不操作,在数组里选择一个数移动到其他的数组里面,最后每一个数组取最小值相加,求和的最大值
翻译:

阿尔乔姆向女孩奥利娅建议玩一个游戏。存在一个包含n个数组的列表,其中第i个数组包含mi≥2个正整数ai1, ai2,…,ai.mi。

Olya最多可以将一个整数(可能为0)从一个数组移动到另一个数组。请注意,整数只能从一个数组中移动一次,但整数可以多次添加到一个数组中,并且所有移动都是同时完成的。

数组列表的美妙之处在于求和∑ni=1minmij=1ai,j。换句话说,对于每个数组,我们找到其中的最小值,然后将这些值相加。

游戏的目标是最大化数组列表的美感。帮助奥利亚赢得这个具有挑战性的游戏!

输入 每个测试由多个测试用例组成。第一行包含一个整数t(1≤t≤25000)——测试用例的数量。下面是测试用例的描述。

每个测试用例的第一行包含一个整数n(1≤n≤25000)——列表中的数组数。

后面是数组的描述。每个数组描述由两行组成。

第一行包含一个整数mi(2≤mi≤50000)——第i个数组中的元素数。

下一行包含mi个整数ai,1,ai,2,…,ai,mi(1≤ai,j≤109)-第i个数组的元素。

可以保证所有测试用例的mi之和不超过50000。

输出 对于每个测试用例,输出包含单个整数的单行—这是Olya可以实现的数组列表的最大美感。

思路

每一个数组都可以选择移动或者是不移动,所以这个数组中最后能参与最后的最小值相加的数字只有可能是最小值或者是次小值(也就是第二小的数)要想把最后的值尽量变大,我们就优先把所有的最小值拿出来,放到一个数组里面,尽可能的使得每一个数组的次小值参与求和运算,最后最小值们都放到一个数组里面,我们找一个次小值里面最小的一个数组,放下所有的最小值即可。

代码

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

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        long long sum=0;
        int zongminzhi1=INT_MAX;
        int zongminzhi2=INT_MAX;
        for(int i=0;i<n;++i)
        {
            int minzhi1=INT_MAX,minzhi2=INT_MAX;
            int k;
            scanf("%d",&k);
            for(int j=0;j<k;++j)
            {
                int shuru;
                scanf("%d",&shuru);
                if(shuru<=minzhi1)
                {
                    minzhi2=minzhi1;
                    minzhi1=shuru;
                }
                else if(shuru<=minzhi2)
                {
                    minzhi2=shuru;
                }
            }
            zongminzhi1=min(minzhi1,zongminzhi1);
            zongminzhi2=min(minzhi2,zongminzhi2);
            sum+=minzhi2;
        }
        printf("%lld\n",sum+zongminzhi1-zongminzhi2);
    }
    return 0;
}

C. Another Permutation Problem

在这里插入图片描述

题目大意

给你一个数n,在n的全排列中找到一个能够使得(∑ni=1=p i ⋅i)−(maxnj=1p j ⋅j)的值最大。
翻译:

安德烈刚刚开始出现问题,这对他来说很困难。这就是为什么他提出了一个关于排列的奇怪问题,并让你去解决它。你能做到吗?

让我们把长度为n的排列的代价称为表达式的值:

(∑ni=1=p i ⋅i)−(maxnj=1p j ⋅j)。找出长度为n的所有排列的最大代价。

长度为n的排列是由n个不同的整数以任意顺序从1到n组成的数组。例如,[2,3,1,5,4]是一个排列,但[1,2,2]不是一个排列(2在数组中出现两次),[1,3,4]也不是一个排列(n=3,但数组中有4)。

输入 每个测试由多个测试用例组成。第一行包含一个整数t(1≤t≤30)——测试用例的数量。下面是测试用例的描述。

每个测试用例的唯一一行包含一个整数n(2≤n≤250)——排列的长度。

可以保证所有测试用例的总和不超过500。

输出 对于每个测试用例,输出一个整数——长度为n的所有排列中的最大代价。

思路

通过打表发现所有的最大值都是发生在前面部分正序,后面一部分倒序的排序方法,比如说
n=2时,最大:2 1
n=3时,最大:1 3 2
n=4时,最大:1 2 4 3
n=5时,最大:1 2 5 4 3
n=6时,最大:1 2 3 6 5 4
n=7时,最大:1 2 3 4 7 6 5
n=8时,最大:1 2 3 4 8 7 6 5

以下是打板的代码:

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

int main()
{
    int t=10;
    for(int k=1;k<t;++k)
    {
        int maxzhi0=0;
        {
            cout<<"n=="<<k<<endl;
            int a[200]{0};
            int n=k;
            for(int i=1;i<=n;++i)
            {
                a[i]=i;
            }
            int b[200]{0};
            do
            {
                long long sum=0;
                int maxzhi=INT_MIN;
                for(int i=1;i<=n;++i)
                {
                    sum+=a[i]*i;
                    maxzhi=max(maxzhi,a[i]*i);
                }

                if(maxzhi0<sum-maxzhi)
                {
                    maxzhi0=sum-maxzhi;
                    for(int i=0;i<200;++i)
                        b[i]=a[i];
                }
            }while(next_permutation(a+1, a+n+1));
            cout<<"max="<<maxzhi0<<endl;
            for(int i=1;i<=n;++i)
            cout<<b[i]<<' ';cout<<endl;
            printf("***********\n");
        }
    }
    return 0;
}

找到大致的规律之后只需要一个O(n)的枚举就好了,因为不知道最后的目标值大概是需要倒转多少个数字,直接暴力枚举

代码

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

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        long long ans=0;
        long long zong=0;
        for(int i=1;i<=n;++i)
        {
            int maxzhi=0;
            ans=0;
            for(int j=1;j<=n-i;++j)
            {
                ans+=j*j;
                maxzhi=max(maxzhi,j*j);
            }
            for(int j=n;j>=n-i+1;--j)
            {
                ans+=j*(n-i+1+(n-j));
                maxzhi=max(maxzhi,j*(n-i+1+(n-j)));
            }
            ans-=maxzhi;
            zong=max(ans,zong);
        }
        cout<<zong<<endl;
    }
    return 0;
}

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

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

相关文章

03_013内存分配api以及页表详解

前言 之前文章中物理ram中的最小单位一直用页来表示 这次又描述的详细了点 物理ram的最小单位 有的地方叫 块,框,页帧 在虚拟空间中最小单位也叫页 需要好好区分 不过后来想想管你虚拟页还是物理ram页 都存在物理ram上 都能想成一 一对应的关系 所以大家都叫页好像也行 内存分…

【Unity3D】Shader Graph节点

1 前言 Shader Graph 16.0.3 中有 208 个 Node&#xff08;节点&#xff09;&#xff0c;本文梳理了 Shader Graph 中大部分 Node 的释义&#xff0c;官方介绍详见→Node-Library。 Shader Graph 通过图像的形式表达了顶点变换和片元着色流程&#xff0c;其背后都是一些列的数学…

保持城市天际线(力扣)贪心 JAVA

给你一座由 n x n 个街区组成的城市&#xff0c;每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天际线 是从远处观察城市时&#xff0c;所有建筑物形成的外部轮廓。…

【系统架构】分布式系统架构设计

1 分布式系统是什么 分布式系统是指由多个计算机节点组成的一个系统&#xff0c;这些节点通过网络互相连接&#xff0c;并协同工作完成某个任务。 与单个计算机相比&#xff0c;分布式系统具有更高的可扩展性、可靠性和性能等优势&#xff0c;因此广泛应用于大规模数据处理、高…

大数据-玩转数据-Flink 自定义Sink(Mysql)

一、说明 如果Flink没有提供给我们可以直接使用的连接器&#xff0c;那我们如果想将数据存储到我们自己的存储设备中&#xff0c;mysql 的安装使用请参考 mysql-玩转数据-centos7下mysql的安装 创建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

使用日志来监控应用

根据提取规则运行的位置可以分为两类做法&#xff0c;一个是在中心端&#xff0c;一个是在日志端。 中心端就是把要处理的所有机器的日志都统一传到中心&#xff0c;比如通过 Kafka 传输&#xff0c;最终落到 Elasticsearch&#xff0c;指标提取规则可以作为流计算任务插到 Ka…

3.解构赋值

解构赋值是一种快速为变量赋值的简洁语法&#xff0c;本质上仍然是为变量赋值。 3.1数组解构 数组解构是 将数组的单元值快速批量赋值给一系列变量 的简洁语法 1.基本语法: &#xff08;1&#xff09;赋值运算符左侧的[ ]用于批量声明变量&#xff0c;右侧数组的单元值将被赋…

免费开源的多种人工智能项目,比如:训练一个模型,让人工智能玩王者荣耀

免费开源的多种人工智能项目&#xff0c;比如&#xff1a;训练一个模型&#xff0c;让人工智能玩王者荣耀。 全文大纲 PULSE - 该开源项目可以通过给图片增加像素点来实现去马赛克或高清化。 Depix - 给打了马赛克的文字去码。 TecoGAN - 给视频去马赛克或者进行超分辨率。 Sk…

python -- 函数闭包

1. LEGB规则 L: local 是局部作用域 E: Enclosed 是嵌套函数的外层函数作用域 G: Global 全局作用域 B:Build-In 内置作用域 变量的使用权重&#xff1a;局部变量 > 外层作用域变量 > 全局变量 > 内置变量 下面代码执行后&#xff0c;x变量的值分别为多少&#xff1…

【JavaEE基础学习打卡03】Java EE 平台有哪些内容?

目录 前言一、Java EE平台说明二、Java EE平台容器及组件1.平台容器2.平台组件 三、JavaEE平台API服务1.API服务概览2.平台API 总结 前言 &#x1f4dc; 本系列教程适用于Java Web初学者、爱好者&#xff0c;小白白。我们的天赋并不高&#xff0c;可贵在努力&#xff0c;坚持不…

Opencv特征检测之ORB算法原理及应用详解

Opencv特征检测之ORB算法原理及应用详解 特征是图像信息的另一种数字表达形式。一组好的特征对于在指定 任务上的最终表现至关重要。视觉里程 &#xff08;VO&#xff09; 的主要问题是如何根据图像特征来估计相机运动。但是&#xff0c;整幅图像用来计算分析通常比较耗时&…

算法通过村第三关-数组基础笔记|爱不起的数组

文章目录 前言线性表的概念什么是线性表从语言实现的角度看从存储的角度看从访问限制的角度看从扩容的角度看数组的概念数组元素的特征 数组的基本操作数组的创建和初始化查找一个元素增加一个元素删除一个元素 总结 前言 提示&#xff1a;孩子们有时候挺伤人的&#xff0c;他…

两个数组的交集-C语言/Java

描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。&#xff08;1 < nums1.length, nums2.length < 1000&#xff0c;0 < nums1[i], nums2[i] < 1000&#xff09; 示例1 输入…

Linux源码剖析匿名共享内存shmem原理

如下问题如果都清楚了就不用看本文了&#xff1a; 1. shmem ram文件系统的初始化流程是怎样的 2. shmem思想上想复用基于文件的操作流程&#xff0c;实现上shmem也引入了一个文件&#xff0c;那么类似文件open会生成struct file&#xff0c;shmem的struct file怎么生成的 3.…

C语言 棱形图案

目录 一、问题分析 上部分&#xff1a; 下部分&#xff1a; 二、代码演示 一、问题分析 如上图所示&#xff0c;我们可以将棱形进行拆解&#xff0c;分为上下两个部分。 上部分&#xff1a; 通过观察&#xff0c;我们得到 单边空格数 上半部分总行数 - 行数 - 1 …

graphab 教程 ——安装

graphab 软件致力于从图论的框架对生态网络进行建模。Graphab是基于图论原理建立生态网络模型的软件,它可以实现景观组分可视化、连通性分析等,且易于与地理信息系统兼容。Graphab 是基于Java平台开发的,可直接在 Windows、Linux,Mac等操作系统中运行,界面友好且易于使用。Grap…

HCIP学习--BGP实验

一、实验拓扑 二、实验需求 除R5的5.5.5.0环回外&#xff0c;其他所有的环回均可互相访问 三、实验步骤 首先配置IP&#xff0c;配置好IBGP 建立直连的EBGP邻居关系 R1和R2建立直连的EBGP邻居关系 [r1]bgp 1 [r1-bgp]router-id 1.1.1.1 [r1-bgp]peer 12.1.1.2 as-number …

MyBatis插件开发

目录 一、项目简单搭建二 、一个接口了、两大注解、四大对象三、脱敏插件开发 一、项目简单搭建 demo结构&#xff0c;已经搭建了无数次了&#xff0c;懒的粘贴了 o(╥﹏╥)o pom文件 <dependency><groupId>org.springframework.boot</groupId><artifa…

AIGC商用实例—大模型技术助力AI测谎仪,实现视频通话实施测谎!

大家好&#xff0c;我是千寻哥&#xff0c;最近一段时间&#xff0c;给大家分享了不少的AI绘画相关的项目教程&#xff0c;很多星友都反映真的不错&#xff0c;我自己也是感觉很有意义&#xff01; 哈哈哈&#xff0c;今天我在看到了一个项目柑感觉是一个不错的idea&#xff0c…

下一代深度学习的思考与若干问题

下一代深度学习的思考和若干问题