「一本通 1.3 例 5」weight]
「一本通 1.3 例 5」weight
题面
给定原数列 \(a_1,a_2,a_n\) ,给定每个数的前缀和以及后缀和,并且打乱顺序。
给出一个集合 \(S\) 要求从集合 \(S\) 中找到合适的数,满足给定的所有数例前缀和和后缀和,答案保证最小的
思路
很多人上来没有思路,不知从何搜起
简单讲就是找到正确的搜索顺序,往里面放数就好了
他不是有前缀和也有后缀和嘛~,而且还是混着的,
那么你就直接排序,然后安排两个指针 \(L\) 和 \(R\) 的表示左边和右边,
记录每个 \(L\) 的前缀和 和 \(R\) 的后缀和,然后用当前的你所枚举的(题中给出的混杂数列)\(A[k]\) 相减,即 \(A[k] - Sum[L] \ 或者
A[k] - Sum[r]\) ,只要相减的差在给定集合 \(S\) 里,直接搜索下一层,两个指针肯定会跑到一起,最后再判断答案合不合限定范围就可以了 \(Over\)
-----------------------------------------------------------------------分割线----------------------------
详细的说 就是通过给定的条件,找到约束条件,进而说明我为什么要选择上面的搜索顺序和思路
- 令 满足要求的 \(SumL_i\) (原数列 \(N\),右同),表示位置 \(i\) 的前缀和 ,
- 令 满足要求的 \(SumL_j\) 表示位置 \(j\) 的后缀和,
- 令 \(ans_i\) 为答案数列
不难发现
可以将打乱的先排序,最后的数\(Max\)显然就是 \(SumL_n\) 和 \(SumR_n\), 最小的数 \(Min\) 要不是最左边,要不是最右边。(剪枝1)
我们从已知条件的数据当中任意取出两个数的时候,只会出现以下两种情况:

当为一种情况时,即都为前缀和或后缀和(后面的前缀和和后缀和统一用 \(Sum\) 表示,以为我说的是第一种情况),
那么 \(Sum_{i+1} - Sum_i\) 就是位置 \(i\) 的 \(ans[i]\) ,所以我们找到了达成要求的条件,即知道满足 两个\(A[k] - A[p] (k,p均为变量)\) 的差值在集合 \(S\) 中,那么就找到了当前正确的 \(Sum_i\)
凭着是上面的条件,我们可以将枚举 \(A[k]\) ,并放入相应的位置中,那么他放的可能无非就两种,一是放在左边,二是放在右边,那么枚举时记录一下左右当前位置 \(L\) 和 \(R\) (即在 \(L-R\) 范围内都是还没填上数的),一直搜到 \(L == R\) ,输出就行,(因为开始我先进行了排序,所以找到的答案一定为最小序列的)
终于说完了~累死了
Code
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
//#define int long long
const int manx = 1e7;
const int maxm = 1e8;
const int inf = 0x3f3f3f3f;
int read(){
char c = getchar();int x = 0,f = 1;
for( ;!isdigit(c);c = getchar()) if(c == '-') f = -1;
for( ;isdigit(c);c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int a[manx],ans[manx];
bool vis[manx],flag;
int n, m, i;
void dfs(int k ,int l ,int r ,int sum_l ,int sum_r){
/*
k 表示枚举的数据给出的已经排完序的A[k]
l,r 表示搜到的左右边界(l,r是我们要填数的其中一个,所以记录的都是他们前一个或后一个的和),
sum_l,sum_r 分别记录的是l-1的前缀和,r+1的后缀和,
*/
if(flag == true) return;//完成深搜
if(l == r){
if(vis[a[k] - sum_l] == false && vis[a[k] - sum_r] == false) return;
if( a[2 * n] - sum_l - sum_r < 1 || a[2 * n] - sum_l - sum_r > 500) return; //这里被卡,防止在加数的先选的大的,剩下个小的,之后一相减就成负数了
ans[l] = a[2 * n] - sum_l - sum_r;
for(i = 1;i <= n; i++) printf("%d ",ans[i]);
cout<<'\n';
flag = true;
}
if(vis[a[k] - sum_l] == true ){
ans[l] = a[k] - sum_l;
dfs(k + 1 ,l + 1 ,r ,a[k] ,sum_r);
}
if(vis[a[k] - sum_r] == true ){
ans[r] = a[k] - sum_r;
dfs(k + 1 ,l , r - 1,sum_l , a[k]);
}
}
int main(){
//freopen("dd.in","r",stdin);
//freopen("dd.out","w",stdout);
n = read();
for(i = 1;i <= n * 2;i ++) a[i] = read();
sort(a + 1 ,a + 1 + n * 2);
m = read();
for(i = 1;i <= m; i++) {
int x = read();
vis[x] = true;//表示x这数在不在集合S当中
}
dfs(1,1,n,0,0);
return 0;
}
最累的题解了~
「一本通 1.3 例 5」weight]的更多相关文章
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...
- 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP
题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair (Trie
题目描述 在给定的 $N$ 个整数 $A_1,A_2,A_3...A_n$ 中选出两个进行异或运算,得到的结果最大是多少? 输入格式 第一行一个整数$N$. 第二行$N$个整数$A_i$. 输出格式 ...
- 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd
题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...
- 「LOJ#10034」「一本通 2.1 例 2」图书管理 (map
题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需 ...
- Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...
- LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci
题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...
随机推荐
- Omega System Trading and Development Club内部分享策略Easylanguage源码
更多精彩内容,欢迎关注公众号:数量技术宅.关于本期分享的任何问题,请加技术宅微信:sljsz01 关于 Omega System Trading and Development Club " ...
- SpringMVC+JPA+SpringData配置
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ...
- Spring Cloud Config原码篇(十)
上篇中说到通过@Value注解获取配置中心的内容进行注入,要想了解这个就要知道spring Environment原理,关于这原理我看了下网上分析的文章:https://blog.csdn.net/t ...
- 手摸手带你用Hexo撸博客(三)之添加评论系统
原文地址 注: 笔者采用的是butterfly主题, 主题内置集成评论系统 butterfly主题开启评论 开启评论需要在comments-use中填写你需要的评论. 以Valine为例 commen ...
- 第六章节 BJROBOT 动态导航壁障
导航前说明:一定要确保你小车在构建好地图的基础上进行! 1.把小车平放在你想要构建地图区域的地板上,打开资料里的虚拟机,打开一个终端, ssh 过去主控端启动 roslaunch znjrobot b ...
- MongoDB备份(mongoexport)与恢复(mongoimport)
1.备份恢复工具介绍: mongoexport/mongoimport mongodump/mongorestore(本文未涉及) 2.备份工具区别在哪里? 2.1 mongoexport/mongo ...
- Web Service 服务无法连接Oracle数据库
这个问题之前部署就遇到过,但是后来忘了,所以记录一下吧. 我部署Web Service服务的时候,服务没法正常运行,与Oracle数据库无法正常通信. 检查了数据库连接字没有任何问题,写了个测试接口, ...
- Python requirements.txt 语法
前言 之前一直苦于一个问题,比如一些包在Win上安装不了,比如 uvloop 但是为了提高效率,代码中必须有这个模块 在运行中可以通过 os 模块判断是否使用, 那依赖文件呢? requirement ...
- Flutter 基础组件:输入框和表单
前言 Material组件库中提供了输入框组件TextField和表单组件Form. 输入框TextField 接口描述 const TextField({ Key key, // 编辑框的控制器,通 ...
- MySQL中的全局锁和表级锁
全局锁和表锁 数据库锁设计的初衷是解决并发出现的一些问题.当出现并发访问的时候,数据库需要合理的控制资源的访问规则.而锁就是访问规则的重要数据结构. 根据锁的范围,分为全局锁.表级锁和行级锁三类. 全 ...