CF1512E Permutation by Sum(思维)

news/2024/11/18 1:46:50/

题目传送门
这道题是我灵光一闪突然想到的做法。
首先叙述一下题意:
这道题的意思就是说:给你四个数n,a,b,s让你构造一个长度为n的数字序列,这个序列的要求是数字必须是在1~n中的,而且不能有重复的数字,并且在下标a ~ b所对应的你构造的数组的和为s。
那么这道题就十分容易就能转换成为如下问题:
请问b-a+1个数字能否组成s?
那么我们设有要求的区段的数组所对应的初始值为(1,2,3……),也就是最小值,s-min所对应的就是有要求的区段的向右移动的位数。
例如:
3 1 2 4这一组样例,我们就是:
构造的数组的长度为3
我们先确定1~2区间应该填写哪些数
先填入最小一组数(从小到大遍历,防止出现重复的现象)
a[1]=2,a[2]=1(从大到小遍历数据,防止出现重复的情况)
a[1] 2->3
a[2] 1->2
同理如果n=4:
那么a[1] 2->3->4
a[2] 1->2->3
这样的话就可以最多向右移动两位
那么a[1]=2,可以向右移动3-[(2-1)+1]位,也就是可以向右移动1位,a[2]同理(防止出现相同的情况,所以只能最多移动到2).
每一个数都最多可以向右移动(n-(b-a+1))位,那么我们只需要找到s-n,然后从a[1]开始遍历,一直到达目标数组就可以了。
下面是AC代码

#include<iostream>
#include<map>
#include<cstring>
using namespace std;
typedef long long ll;
map<int,int>mp;
int an[210210];
int ans[210200];
int main(){int T;cin>>T;for(int i=1;i<=600;i++)an[i]=i;while(T--){memset(ans,0,sizeof ans);mp.clear();int n,a,b,s;cin>>n>>a>>b>>s;int num=b-a+1;int minn=0,maxx=0;for(int i=1;i<=num;i++){minn+=an[i];}for(int i=n-num+1;i<=n;i++){maxx+=an[i];}if(s<minn||s>maxx){printf("-1\n");continue;}int di=s-minn;int kk=n-num;for(int i=a,j=num;i<=b;i++,j--){int u=kk;ans[i]=j;if(di)for(int pp=1;pp<=kk;pp++){ans[i]++;di--;if(di==0)break;}mp[ans[i]]++;}for(int i=1;i<=n;i++){if(ans[i]==0){int uu=0;for(int i=1;i<=n;i++){if(!mp[i]){mp[i]=1;uu=i;break;}}ans[i]=uu;}}for(int i=1;i<=n;i++){printf("%d ",ans[i]);}printf("\n");}
}

http://www.ppmy.cn/news/271982.html

相关文章

1512 好数对的数目

题目描述&#xff1a; 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j &#xff0c;就可以认为这是一组 好数对 。 返回好数对的数目。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1,1,3] 输出&#xff1a;4 解释&#xff1a;有 4 组…

大数据基础-Hadoop MP开发

1. MAPREDUCE原理篇&#xff08;1&#xff09; Mapreduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于hadoop的数据分析应用”的核心框架&#xff1b; Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c…

ZYNQMP_XAZU3EG_LINUX 默认启动项修改

默认启动项为 ZynqMP> print default_bootcmd default_bootcmdrun uenvboot; run cp_kernel2ram && bootm ${netstart} 由于启动vx7改动&#xff0c;需要恢复&#xff0c;做如下改动&#xff0c;恢复正常 ZynqMP> setenv bootcmd $default_bootcmd ZynqMP>…

Xilinx zynq zynqmp Macb Gem千兆网使用

作者 QQ群&#xff1a;852283276 微信&#xff1a;arm80x86 微信公众号&#xff1a;青儿创客基地 B站&#xff1a;主页 https://space.bilibili.com/208826118 参考 zynqMP GEM 如何配置GT lane Zynq MPsoc的GEM Ethernet DTS问题 2017.1-2018.3 Zynq UltraScale MPSoC: Linu…

【Arduino + Linux】基于 Helix 解码库实现 MP3 音频播放

目录 一、MP3 文件结构1.1、ID3V2.31.1.1、标签头1.1.2、扩展标签头1.1.3、标签帧 1.2、音频数据1.3、ID3V11.4、MP3文件结构图 二、MP3 解码库三、Windows上播放MP3文件3.1、伪代码分析3.2、创建项目 & 编译生成可执行文件 四、ESP32上播放MP3文件4.1、VS Code开发环境搭建…

STM32MP157学习笔记(四) ---- Debian文件系统移植

一、构建 Debian for ARM Linux 主机环境 $ uname -a Linux lodge-ubuntu 5.11.0-35-generic #37~20.04.1-Ubuntu SMP Mon Sep 13 13:30:34 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux 1、安装构建工具 sudo apt-get install binfmt-support qemu qemu-user-static debootst…

Java程序执行流程

Java程序执行的整个过程可以分为三个阶段&#xff1a;编译、加载和运行 1.编译 Java程序的源代码需要经过编译器&#xff08;例如javac&#xff09;的编译&#xff0c;将其转换成字节码&#xff08;即.class文件&#xff09;&#xff0c;这个过程称为编译。编译器会对源代码中…

电脑充电器,电脑充电器没带怎么充电

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 电脑充电器没带的解决方法&#xff1a; 1、有USB的充电线&#xff0c;另一端插到手机中即可充电。 2、借用别人的充电器。 3、把电池装在别人的电脑上充满再用。 4、笔记本可以用车…