Codeforces 1月8日dev.2 A题解析

2023-11-09

先看题目:

A. Make it Beautiful

time limit per test3 seconds

memory limit per test512 megabytes

inputstandard input

outputstandard output

An array aa is called ugly if it contains at least one element which is equal to the sum of all elements before it. If the array is not ugly, it is beautiful.

For example:

  • the array [6,3,9,6][6,3,9,6] is ugly: the element 99 is equal to 6+36+3;

  • the array [5,5,7][5,5,7] is ugly: the element 55 (the second one) is equal to 55;

  • the array [8,4,10,14][8,4,10,14] is beautiful: 8≠08≠0, 4≠84≠8, 10≠8+410≠8+4, 14≠8+4+1014≠8+4+10, so there is no element which is equal to the sum of all elements before it.

You are given an array aa such that 1≤a1≤a2≤⋯≤an≤1001≤a1≤a2≤⋯≤an≤100. You have to reorder the elements of aa in such a way that the resulting array is beautiful. Note that you are not allowed to insert new elements or erase existing ones, you can only change the order of elements of aa. You are allowed to keep the array aa unchanged, if it is beautiful.

Input

The first line contains one integer tt (1≤t≤20001≤t≤2000) — the number of test cases.

Each test case consists of two lines. The first line contains one integer nn (2≤n≤502≤n≤50). The second line contains nn integers a1,a2,…,ana1,a2,…,an (1≤a1≤a2≤⋯≤an≤1001≤a1≤a2≤⋯≤an≤100).

Output

For each test case, print the answer as follows:

  • if it is impossible to reorder the elements of aa in such a way that it becomes beautiful, print NO;

  • otherwise, in the first line, print YES. In the second line, print nn integers — any beautiful array which can be obtained from aa by reordering its elements. If there are multiple such arrays, print any of them.

Example

input

4

4

3 3 6 6

2

10 10

5

1 2 3 4 5

3

1 4 4

output

YES

3 6 3 6

NO

YES

2 4 1 5 3

YES

1 4 4

题目解释:

题目中给出了一个漂亮数组和丑数组的定义:如果一个数组中,存在某一个元素等于他前面所有项的元素之和,那么他就是丑数组,反之则为漂亮数组。题目中给出了例子。

第一个例子 6 3 9 6 第三个元素9等于前两个元素6,3之和 所以他是丑数组

第二个例子5 5 7 第三个元素5 等于前面元素 5 的和 所以他也是丑数组

第三个例子 不存在某一元素等于前面元素之和 所以是漂亮数组

现在,要求依次输入t(案例次数1<=t<=2000 ),n(表示数组有n个元素 2<=n<=50),紧接着输入n个数代表数组中每个元素,现在你可以对这个数组内的元素进行任意排序,如果经过排序之后可以为漂亮数组 那么输出YES 并且将这个漂亮数组输出,如果无论如何也出现不了漂亮数组,那么输出NO

例如示例1 :

3 3 6 6 本身是个丑数组 但是经过排序之后可以为 6 3 6 3 变成了一个漂亮数组 那么输出YES 并且把 6 3 6 3输出

思路分析:

这个题目初看起来,判断丑和漂亮上不难理解,但是主要问题在于,如何找到满足条件的漂亮数组,并且到底是yes还是no。这是本题目的两个核心问题。

那么如何解决呢????

思路一:

其实整个数组,判断到底时yes还是no,只要看第一个元素,第二个元素,以及最后一个元素,所以我们只要把数组倒序,特判一下a[0]==a[n-1]和a[0]==a[1]其实就可以了,然后适当的把三个位置的数字换一下顺序就行了。至于详细思路,看思路二更容易理解。

思路一的代码如下

#include<bits/stdc++.h>
using namespace std;
#define yes cout<<"YES"<<"\n";
#define no cout<<"NO"<<"\n";
const int N = 1e6 + 10;
int b[55];
void solve(){
    int n; cin >> n;
    vector<int>a(n); int fg = 1;
    for (int i = 0; i < n; i++) {
    cin >> a[i];
    }
    if (a[0] == a[n - 1]) { no return; }
    if (n & 1) {
        for (int i = 0; i <(n-1)/2; i++) {
            int t = a[i];
            a[i] = a[n - 1 - i];
            a[n - 1 - i] = t;
        }
    }
    else for (int i = 0; i < n / 2; i++) {
        int t = a[i];
        a[i] = a[n - 1 - i];
        a[n - 1 - i] = t;
    }
    if (a[1] == a[0]) {
        a[1] = a[n - 1];
        a[n - 1] = a[0];
    }
    yes
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    cout << "\n";
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int t; cin >> t;
    while (t--) {
        solve();
    }
}

思路二:

我们要注意到一个点,数组中的每个元素都是大于1的,意思就是不会出现0,这是个很重要的地方。我们来看看,根据丑和漂亮的定义,我们既然要漂亮,那么就要保证后面的数字不会等于前面数字相加。

而满足这个条件有两种方法:

1:让前面的和小于这个数

2:让前面的和大于这个数

那么这个时候,我们就要在两个方法里面进行选择。这两个方法都需要我们能确保能满足所对应的条件。

我们看法一,要满足前面的数字的和小于这个数,是不是完全没有控制方法?根本无法确定如何排序能保证和小于这个数,但是法二就不一样了,为什么呢?我们想要和大于这个数,那么是不是只要其中任意一个数大于等于这个数,再加上因为其他数字都大于0, 就可以保证 和 一定大于这个数。所以我们只需要保证前面有数字大于这个数。

那么如何保证呢?很简单,直接把数组进行从大到小排序,那么就可以保证每个数都是第一个到他为止中所有数字中最小的。

按照这个思路,我们应该是可以找到这样的漂亮数组,那么如何去判断是不是会存在呢?其实很简单了,因为我们把数组从大到小排序后:假设为 a1 a2 a3 a4 a5 a6 .....an 那么只有一种情况会出现无法YES 这种情况就是a1到an全部相同。因为只有这样才会出现NO,当数组元素都相同的时候,无论如何排序,其实都一样,就会导致a1=a2,那么有且只有a2的存在就会使得整个数组变成丑函数,因为后面的数字不可能等于前面的数字相加,只能小于;但如果整个数组不是全部相同但是a1=a2时(因为a2是我们唯一的威胁,解决他那么整个问题也就解决了),我们变可以把a1与an进行更换(或者a2与an),这样而来a2的威胁就消失了,这个题目也就迎刃而解了。

思路二代码

#include<stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}
int main()
{
    int t,i,n;
    int g,h,sum,flag;
    int *a;
    scanf("%d",&t);
    for(i=1;i<=t;i++){
        scanf("%d",&n);
        a=(int *)calloc(n,sizeof(int));
        for(g=0;g<n;g++){
            scanf("%d",&a[g]);
        }
        sum=0;
        for(g=0;g<n;g++){
            sum+=a[g];
        }
        if(sum!=a[0]*n){
            printf("YES\n");
            qsort(a,n,sizeof(a[0]),cmp);
            if(a[0]==a[1]){
                t=a[0];
                a[0]=a[n-1];
                a[n-1]=t;
            }
            for(g=0;g<n;g++){
                printf("%d ",a[g]);
            }
            printf("\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
 } 

但是在提交的时候,遇到点问题,思路二的思路绝对没问题,但是在提交之后,测试点二一直过不了,我看了其他的选手的代码,也有不少也是思路二,但是他们的都过了,我和朋友商讨过,暂且没有得出结果。各位大佬如果路过,帮忙看一下是不是代码问题。今天的签到题解析到此为止啦!

老规矩,希望大伙的点赞 收藏 留言 与建议

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Codeforces 1月8日dev.2 A题解析 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • wiringPi引脚编号方式

    树莓派引出的20 2排针引脚 引脚定义使用gpio readall命令查看 如下 可以看到wiringpi库有三种引脚编号方式 分别为 BCM编号方式 就是使用芯片的GPIO引脚编号 wiringpi库编号方式 使用wiringpi库自己规
  • LR(1)项目集族的构造:如何确定前向搜索符(新版)

    旧版链接 https blog csdn net hhhhhhhhhhkkkkkkkkkk article details 19990287 按照这个标题搜进来的各位是不是以为这也是和课本一样的内容呢 其实这是我看了两天课本才理解出来的内容
  • C++ Primer笔记——查找算法

    目录 一 简单查找 find first last val find if find if not count count if all of any of none of 二 重复值的查找 adjacent find first end
  • Centos8 重新安装yum

    手残卸载了cnetos8自带的yum命令 然后各种搜索重新安装 有centos7下重新安装的 也有dnf重新安装yum的 结果都不好用 一 准备工作 重新安装yum前 请自行卸载yum相关参与包 卸载python rpm qa grep p
  • umi中操作mock中的数据实现搜索操作

    我们定义两个属性 分别是我们的原始数据和渲染的数据 const book setbook useState 原始数据 const sear setSear useState 用于渲染的数据 input搜索框绑定onChange事件 通过e
  • dedecms自定义内容模型怎么采集

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在用织梦cms系统进行网站开发时 经常会碰到各种各样复杂的需求 因此我们需要用到dedecms提供的自定义内容模型功能去添加自定义内容模型来满足需求 那么dedecms自定
  • 输入第一个字符串A,输入第二个字符串B,统计B在A中出现的次数 abcabcabd abc

    public class strCount public static void main String args 定义字符串 String str abc String ss abcabcabc 定义返回的次数 int count 0 f
  • 【C++ windows多线程使CPU 100%】

    用于windows 平台的CPU 100 预警测试程序 c 实现 cpp程序文件名 win32HighCpuTest cpp include
  • vue3中的setup方法

    一 vue2中的定义变量和方法的写法 在介绍v3的setup之前 我们先来看看在v2中是如何定义变量和方法的
  • stm32——PWM概述

    一 PWM生成方波 C51是用软件的方式进行模拟出方波 STM32F103C8T6中硬件就可以生成PWM方波 芯片中的PWM资源 高级定时器 TIM1 7路 通用定时器 TIM2 TIM4 各4路 共19路PWM 二 PWM输出模式 pwm
  • 【Redis】主从复制

    Redis主从复制 文章目录 Redis主从复制 搭建一主多从 复制原理 常用3招 一主二仆 薪火相传 反客为主 哨兵模式 sentinel 使用步骤 故障恢复 主机数据更新后根据配置和策略 自动同步到备机的master slaver机制
  • 每个程序员都必须遵守的编程原则

    每个程序员都必须遵守的编程原则 来源 外刊IT评论 发布时间 2011 09 03 16 15 阅读 1781 次 原文链接 全屏阅读 收藏 摘要 好的编程原则跟好的系统设计原则和技术实施原则有着密切的联系 本文是从 The Princip
  • Kafka消费者组重平衡(二)

    文章目录 概要 重平衡通知机制 消费组组状态 消费端重平衡流程 Broker端重平衡流程 概要 上一篇Kafka消费者组重平衡主要介绍了重平衡相关的概念 本篇主要梳理重平衡发生的流程 为了更好地观察 数据准备如下 kafka版本 kafka
  • 猫和老鼠服务器维修有问题,猫和老鼠手游老是掉线怎么办 频繁网络中断解决方法...

    猫和老鼠手游为什么老是掉线呢 许多玩家在玩的过程中频繁遇到这个掉线的问题 导致体验非常糟糕 有什么方法可以减轻或者彻底避免掉线的问题呢 下面小编就为大家介绍一下吧 1 信号不好 如果你是身处于火车 地铁 地下室 电梯 或者比较偏远信号不好的
  • Solidity学习笔记2——Webase积分合约

    代码段学习笔记 代码来源 Webase合约仓库 我只做了增加注释的工作用来记录相关知识点 pragma solidity 0 4 24 import SafeMath sol import Roles sol import Address
  • 特征值_特征值的性质:特征多项式角度

    本文从特征多项式展开角度介绍了特征值的性质 从而使读者有更加深刻的理解 一 特征值的性质 二 特征值性质的联系 若A为3阶方阵 我们将系数行列式展开 最后得到特征多项式如下 推导过程见李永乐线性代数辅导讲义 2021版 P2 评注 部分 现
  • AMR文件格式分析

    最近在传输手机录音时 遇到了AMR编码的问题 开始以为可以任意截断amr文件 加个文件头就可以播放的 后来发现是有问题 这样得到的amr音频有些不能正常播放 后来参看amr格式后 才知道amr文件是一帧一帧的 如果是按照完整的帧前面添加文件
  • socket、tcp、udp、http 的认识及区别

    网络由下往上分为物理层 数据链路层 网络层 传输层 会话层 表示层和应用层 IP 协议对应于网络层 TCP协议对应于传输层 HTTP协议对应于应用层 三者从本质上来说没有可比性 socket则是对TCP IP协议的封装和应用 可以说 TPC
  • 【华为OD机试】数字反转打印(python, java, c++, js)

    数字反转打印 前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email n
  • Codeforces 1月8日dev.2 A题解析

    先看题目 A Make it Beautiful time limit per test3 seconds memory limit per test512 megabytes inputstandard input outputstand