Cpp环境【NOIP2013提高组】摆火柴

火柴排队(NOIP2013D1T2) 火柴排队(NOIP2013D1T2) 数学分析+重构数组+逆序对 数学分析: 我们是要求∑(ai​−bi​)2的最小值,展开可以发现∑ai^2和∑bi^2的值是不会变的,也就是说只用关注交叉项就可以了,求最小值,也就是要使所有交叉项的和最大。 我们可以通过排序不等式来证明。 排序不等式的证明: 只用记住同序和大于等于乱序和大于等于逆序和。所以,当他们为同序和时也即他们数位大小相等时... 阅读详情
【问题描述】   

  涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排 成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:这里写图片描述,其中 ai表示第 一列火柴中第i个火柴的高度,bi表示第二列火柴中第i个火柴的高度。
  每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问 得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。

【输入格式】  

   共三行,第一行包含一个整数 n,表示每盒中火柴的数目。 第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。 第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

【输出格式】   

输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。

【输入样例 】

4
2 3 1 4
3 2 1 4

【输出样例】

1

【样例解释】     

  最小距离是 0,最少需要交换 1 次,比如:交换第 1 列的前 2 根火柴或者交换第 2 列的前 2 根火柴。

【数据范围】   

  对于10%的数据, 1 ≤ n ≤ 10;
  对于 30%的数据,1 ≤ n ≤ 100;
  对于 60%的数据,1 ≤ n ≤ 1,000;
  对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤火柴高度≤ 2^31 − 1。

【思路梳理】

  一道有不小难度的题,是NOIP2013,Day1的第二道题,看起来难以下手,没有什么比较容易的突破口。这里就涉及到一点可能被大家所忽视的数学知识:排序不等式(sequence inequality)。所谓排序不等式,通俗的说法来说就是:顺序和大于等于乱序和大于等于逆序和。具体来说,则是:

排序不等式表述如下:
设有两组数a[1],a[2],……a[n],b[1],b[2],……b[n]满足a[1]≤a[2]≤……≤a[n],b[1]≤b[2]≤……≤b[n](两组数均递增),则有:

a[1]b[n]+a[2]b[n-1]+……+a[n]b[1](逆序和)≤
a[1]b[t]+a[2]b[t]+……+a[n]b[t](乱序和)≤
a[1]b[1]+a[2]b[2]+a[n]b[n](顺序和)

式中t1,t2,……,tn是1,2,……,n的任意一个排列,当且仅当a1=a2=……=an或b1=b2=……=bn时,两个等号成立。

  显而易见的是,我们可以使用暴力算法,用冒泡排序的暴力方法进行硬搜排序,是可以得到可观的分数的!使用冒泡排序的时间复杂度约为这里写图片描述。按照排序不等式的定义,我们并不需要将所有的火柴都分别按照递增/递减的顺序排列,只需要保证a组中第i高的火柴与b组中第i高的火柴在同一个位置就可以了。
  那么可以建立如下的存储结构:用一个结构体存储高度和编号,然后将两组火柴分别从低到高地进行排列,从前往后地将其中一组的编号按照对应位置另一组的编号顺序转存到一个t数组中(例如笔者程序中:t[a[i].id]=b[i].id),对其进行冒泡排序即可。

冒泡排序算法的运作如下:(从后往前)

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

高效算法:依然是上面的存储结构,但是冒泡排序改为效率归并排序,求逆序对。不容易想到,但是实现起来并不难,相信系统学习过分治算法后都能够熟练地写出这个程序来。时间复杂度由上面的这里写图片描述降低为O(n*log(n)),能够通过100%的数据。

【Cpp代码】
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 100005
using namespace std;
const long long mod=99999997;
struct data
{
    int w,id;
    friend bool operator<(data a,data b)
    {
        return a.w<b.w;//按火柴棍的高度排序(似乎应该多关键字排序)
    }
}a[maxn],b[maxn];
int t[maxn],tt[maxn],n;

void initial()
{
    for(int i=1;i<=n;i++)   t[a[i].id]=b[i].id;//将从低到高的两组火柴分别对应的编号id记录下来
}

long long solve(int s,int d)//归并排序,不赘述
{
    if(s>=d)    return 0;

    long long mid=(long long)s+d>>1;
    long long t1=solve(s,mid)%mod;
    long long t2=solve(mid+1,d)%mod;
    long long t3=t1+t2;
    int i=s,j=mid+1,k=s;
    while(i<=mid && j<=d)
    {
        if(t[i]>t[j])   {t3=(t3+mid-i+1)%mod;tt[k++]=t[j++];}
        else tt[k++]=t[i++];
    }
    while(i<=mid)   tt[k++]=t[i++];
    while(j<=d)     tt[k++]=t[j++];

    for(i=s;i<=d;i++)   t[i]=tt[i];//转存一次

    return (t3)%mod;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i].w),a[i].id=i;//记录高度和id
    for(int i=1;i<=n;i++)scanf("%d",&b[i].w),b[i].id=i;
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    initial();
    long long ans=(solve(1,n))%mod;
    cout<<ans;
    return 0;
}
信息学奥赛入门:C++编程与算法思维培养的三年教学实践 编程学习与算法思维培养是计算机科学教育的核心基础。其原理在于通过系统化的逻辑训练,将复杂问题分解为计算机可执行的指令序列,从而提升问题解决能力。掌握编程语言(如C++)和基础算法(如排序、枚举、递归)的技术价值在于构建坚实的计算思维,这是参与信息学奥赛(NOI/CSP)和从事软件开发等领域的必备素养。应用场景广泛,从中学信息技术竞赛到大学计算机专业学习,乃至各类逻辑密集型行业的技能提升,都离不开这一基础。本文聚焦于信息学奥赛入门教学,通过精心设计的知识图谱与学习路径,结合大量贴近生活的比喻和可运行的代码示例 阅读详情

相关推荐

闲的蛋疼:用算法解移动一根火柴问题

最近一直看到诸如的问题,闲的无聊,便写了段代码来自动解答这类问题。初步只能支持标准的数字变化,即9可以变成3,5,6等,但是不能变成13因为一根火柴棍形成不了1(1需要两根火柴棍).另外数字间不能插入符号,例如132不能变成13-2,因为没有空间可以插入。允许更为灵活的变换需要更多的代码,在此不过多深入思考了思路如下:1)首先求出每个字符“0~9 - +”增加一根火柴,减少一根火柴,自身移动一根火...

lucyTheSlayer的博客 4576

排序不等式证明

今天考题有个结论要用排序不等式证明… 为什么他们猜到了结论我什么都不知道啊.. 证明参考了https://blog.youkuaiyun.com/lanchunhui/article/details/52497375 排序不等式是干嘛的呢 首先有两个数列a,ba,ba, b 满足a1&amp;amp;lt;=a2&amp;amp;lt;=...&amp;amp;lt;=an,b1&amp;amp;lt;=b2&amp;amp;lt;=...&amp;amp;l

lunch__的博客 6433

Cpp环境【OpenJudge3344】【Vijos2874】冷血格斗场

【问题描述】   为了迎接08年的奥运会,让大家更加了解各种格斗运动,facer新开了一家冷血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。  我们假设格斗的实力可以用一个正整数表示,成为实力值,两人的实力值可以相同。另外,每个人都有一个唯一的id,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双

天地皆逆旅,你我本行人。 2902

排序不等式、证明及其应用

排序不等式可用于证明相当多不等式的证明;

6233

Cpp环境【Vijos1947】离散化的区间覆盖问题——强有力的感染法

【问题描述】   X轴上方有若干条平行于X轴的线段,求这些线段能够覆盖到的X轴的总长度,如下图:               【输入格式】   第一行一个数n(n<=100000),表示线段个数;   接下来的n行,每行两个整数a,b(-10^9<=a,b<=10^9),代表一条线段的端点。【输出格式】   输出覆盖X轴的长度。【输入样例】 7 20 23 1 5 13 1

天地皆逆旅,你我本行人。 1350

Cpp环境【Uva10815】【Vijos2785】安迪的第一本字典

【问题描述】   输入一段文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出。输入的单词不区分大小写,且保证至少包含有一个单词。【输入格式】   一段不超过500行的文本,每行包含的字符个数不超过1000个字符。【输出格式】   需要输出输入文本中不同的单词,每个单词占一行,单词的所有字母都是小写字母,按字典序排列。【输入样例】 Adventures in Disney

天地皆逆旅,你我本行人。 881

移动火柴问题的程序解法及生成算法

在电视上看到的游戏,规则是:移动1根(目前只看到1根的,或许有两根或以上,不过再多就比较难了)火柴,使给出的4位数成为最大(或最小)。当然火柴不能弄断,也不能消失什么的,这点和偶们小学暑假作业的那种不一样。因此这种题用偶擅长的穷举法来解是最合适不过的了。生成的算法……随机产生!不过产生后可以根据输出的match参数判断题目大概的难度,match的越多应该就越难。程序会用字符拼出火柴的摆放形状以便观

superarhow的专栏 3809

ArcGIS中如何计算多个点到特定线的最短距离

现有一个点图层和一个面图层,怎么来计算这些点到这个面图层,两个面的公共边的最短直线距离呢? 1.首先得将两个图层都转为 投影坐标系 打开工具箱-数据管理工具-要素-面转线 ​ ​ 2.将面图层设为输入要素 注意要将“识别和存储面邻域信息”勾选 ​ 3.面转线成功后 打开线属性表,线图层拥有了 LEFT_FID和RIGHT_FID两个字段 ​ 4.按属性选择,表达式中输入 “LEFT_FID”<>-1 即可选出两个面的公共边 ​再将选...

GIS蒲公英的博客 6715

算法火柴棍问题

题目:现在有n根火柴棍,拼出A+B=C的等式。注意:加号和等号各自需要两根火柴棍,A不等于B,则A+B=C与B+A=C是为不同的等式,所有火柴棍必须都用上。这个题刚看到的时候我也感觉有点无从下手,看完答案后豁然开朗#include&lt;iostream&gt; using namespace std; int fun(int x) { int num=0;//用来计数的变量 int f[1...

song68753的博客 2738

SecureCRT串口连接保姆级教程:从驱动安装到波特率设置(附常见问题解决)

本文提供SecureCRT串口连接的保姆级教程,涵盖从USB转串口驱动安装、端口识别到波特率等核心参数设置的完整流程。针对连接失败、乱码、键盘输入无响应等高频问题,给出了深度排查与解决方案,帮助网络与嵌入式开发新手快速掌握串口调试技能。

weixin_29281941的博客 433

基于OFDM的实时图像传输系统MATLAB仿真:MPSK与MQAM调制性能对比与误码率分析

本文详细介绍了基于OFDM的实时图像传输系统在MATLAB中的仿真实现,重点对比了MPSK与MQAM调制方式的性能差异与误码率分析。通过搭建OFDM系统模型,探讨了QPSK和16QAM在不同信道条件下的表现,包括频谱效率、抗噪能力和误码率等关键指标。文章还提供了MATLAB代码示例和实用技巧,帮助读者快速掌握OFDM图像传输系统的核心算法与优化方法。

weixin_29064009的博客 355

算法-火柴拼数

package com.xjj.Ah; import java.util.Scanner; /*-----枚举算法--穷举算法---- * 1. 现有m(<=24)根火柴,求拼出 a+b=c 的等式; * 2. +=为4根; 火柴全部用上; a+b=c--b+a=c 为2种; 1秒内 * 3. 0~1111之间枚举就行(想想~~~) * * 4.穷举法,当a所需火柴数 + b所

小杰杰的博客 1798

混沌系统在图像加密中的应用(二维离散Hénon混沌映射)

Hénon映射是一种二维离散时间动力系统,由美国数学家Michel Hénon在1976年引入。它是混沌动力系统中的经典模型之一,具有简单的形式和复杂的行为。

weixin_42207434的博客 2488

C语言程序设计实验题3.14摆火柴棒

★实验任务     Alice很喜欢摆火柴棒玩,她经常用火柴棒摆成各种奇奇怪怪的图案。     现在她有N (N为偶数)根火柴棒,她可以将这些火柴棒摆成一个长方形,但是她惊奇 的发现不是每次摆成的长方形面积都相同。     假设每根火柴棒的长度为l,横截面半径长度不记,现在她想知道可以摆成的长方形最 大面积是多少。(由于Alice很爱惜这些火柴棒,她不允许将任意一个火柴棒折断。

Arctring的专栏 1760

IoT安全软件:Forescout二次开发_Forescout基础架构与原理

Forescout平台是一个集成了多种安全功能的综合解决方案,旨在帮助组织管理和保护其网络中的IoT设备。该平台通过自动发现、分类和监控网络中的设备,提供实时的安全可见性和控制。Forescout的核心优势在于其能够处理混合环境中的各种设备,包括传统IT设备、IoT设备和OT设备。Forescout平台由多个核心组件组成,每个组件负责特定的功能。了解这些组件的运作机制是进行二次开发的基础。假设我们需要定义一个策略,禁止所有厂商为XYZ的设备访问互联网。选择策略类型。

chenlz2007的博客 1965

科研级YOLO26下采样革新:ContextGuided模块赋能,让特征降维兼具上下文感知的实战指南

在文件夹下新建,将上述类的代码写入其中。这一步是为了让YOLO26的代码架构能识别我们的自定义下采样模块。

LXY_LOVE36的博客 99

关于NOIP的运行环境

目前(2019年2月22日)仍然是G++ 4.8.4 ,终端运行,命令行: g++ test.cpp -o test ,而g++ 4.8.4默认标准是:-std=gnu++98 。 g++到了gcc6才把默认标准直接改为gnu++14 ,参考资料:https://gcc.gnu.org/gcc-6/changes.html 答案的评测工具是:Atbiter单机版和网络版,区别是网络版支...

weixin_30873847的博客 617

14、X射线图像处理与特征提取全解析

本文全面解析了X射线图像处理与特征提取的关键技术,涵盖图像预处理、滤波、边缘检测、分割与恢复等流程,并深入探讨了几何特征(如面积、周长、圆度、椭圆拟合)、强度特征(均值、方差、对比度)、傅里叶描述符、不变矩(Hu矩、Gupta矩)以及局部描述符(SIFT、SURF)和稀疏表示方法。同时介绍了特征选择的过滤法、包装法和嵌入法,并结合Matlab代码示例展示了各类特征的实际提取过程。文章最后总结了当前技术的应用现状,并展望了深度学习在X射线图像分析中的未来潜力。

pz89012345的博客 133

切比雪夫不等式例题讲解_排序不等式,切比雪夫不等式及伯努利不等式

我们比较熟悉的不等式可能就是下面的这个不等式链以及柯西不等式了:对于不等式链的证明我们可以看下面这张图,非常直观形象:不太懂得也可以看这个视频讲解:知乎视频​www.zhihu.com对于柯西不等式的证明及讲解,我们之前也分享过:https://zhuanlan.zhihu.com/p/107477843​zhuanlan.zhihu.com今天我们主要是来分享一下三个不太用到的不等式:排序不等式...

weixin_39788131的博客 3618

[yolov5/yolov8修改]替换yolov5/yolov8中的主干网络为EfficientNetv2

针对yolov5和yolov8的主干网络进行替换。

PLH19990227的博客 4146

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

啊哈,算法 !--火柴棍公式 ( C语言版 )

题目 : 假如现手中有m(m&lt;=24)个火柴棍,希望拼出A+B=C等式。等式中的A、B、C均为火柴棍拼出来的整数(若该数非0,则最高位不能为0)。 注意: 1、加号与等号各自需要2根火柴棍; 2、如果A不等于B,则A+B=C与B+A=C视为不同的等式(三者均大于0); 3、所有根火柴棍必须全都用上。 思路:24根除去 '+' 和 '=' 4根还有20根,而数字1所需火柴棍最少,需2根...

【Dyson】的博客 2614

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

测试排序函数常用的三个数组:顺序、逆序和乱序

#include using namespace std; const int INDEX_ZERO = 0; //稀尔排序 void shell_sort( int *array, int size ) { if (NULL == array) { throw; } else {

dearwind153的专栏 1138

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Cpp环境【POJ2435】【CQYZOJ3034】【USACO2005 U S Open Silver】Navigating the City城市交通

Description 【问题描述】   A dip in the milk market has forced the cows to move to the city. The only employment available is in the venerable field of taxi-driving. Help the cows learn their way around

天地皆逆旅,你我本行人。 1157

Cpp环境【Uva815】【Vijos2776】洪水 Flood

【问题描述】   有一个n行m列的网格,每个格子是边长为10米的正方形,网格四周是无限高的墙壁,第i行第j列每个格子的海拔高度为h[i][j]。现在网格中有T立方米的水,请你计算网格中的水平面的海拔高度,以及有水格子数目。注意,在网格中,所有有水格子的水平面的海拔高度相同,所以有水格子的数量为海拔高度严格小于水平面高度的格子数目。【输入格式】   第一行整数n和m,表示网格有n行m列。

天地皆逆旅,你我本行人。 903

Cpp环境【POJ3622】【Vijos2990】【Usaco2007】挑剔的美食家

Description 【问题描述】 Like so many others, the cows have developed very haughty tastes and will no longer graze on just any grass. Instead, Farmer John must purchase gourmet organic grass at the Green Gr

天地皆逆旅,你我本行人。 886

Cpp环境【GRYZ2015】【Vijos3150】 足球联赛

【问题描述】   XX中学新一季的足球联赛开幕了。足球联赛有 n只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得 3 分,输一场不得分,平局两只队伍各得一分。   英勇无畏的小鸿是机房的主力前锋,她总能在关键时刻踢出一些匪夷所思的妙球。但是很可惜,她过早的燃烧完了她的职业生涯,不过作为一个能够 Burning 的 girl,她的能力不止如此,她还能预测这个赛季所有

天地皆逆旅,你我本行人。 826
上一篇: Cpp环境【NOIP2012普及组】【Vijos1792】摆花
下一篇: Cpp环境【Vijios1093】文科生的悲哀
cqyz_Lebmond
博客等级 码龄10年 18粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值