LOJ P10249 weight 题解
每日一题 day58 打卡
Analysis
这道题搜索的想法非常巧妙,从两端向中间找,这样可以保证仅仅对于head或tail而言,需要用到的前缀和与后缀和是单调递增的,这样排个序就解决了。
值得一提的是,在搜索时开两个变量记录前缀与后缀和,以便计算。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define maxn 2000+10
#define rep(i,s,e) for(register int i=s;i<=e;++i)
#define dwn(i,s,e) for(register int i=s;i>=e;--i)
using namespace std;
inline int read()
{
int x=,f=;
char c=getchar();
while(c<''||c>'') {if(c=='-') f=-; c=getchar();}
while(c>=''&&c<='') {x=x*+c-''; c=getchar();}
return f*x;
}
inline void write(int x)
{
if(x<) {putchar('-'); x=-x;}
if(x>) write(x/);
putchar(x%+'');
}
int n,m;
int a[maxn],ans[maxn];
int book[maxn*];
int flag=;
void dfs(int num,int head,int tail,int sum_head,int sum_tail)
{
if(flag==) return;
if(head==tail)
{
int x=a[*n]-sum_head-sum_tail;
if(x>=&&x<=&&book[x]==)
{
ans[head]=x;
rep(i,,n) {write(ans[i]); putchar(' ');}
flag=;
}
}
else
{
int x=a[num]-sum_head;
if(x>=&&x<=&&book[x]==)
{
ans[head]=x;
dfs(num+,head+,tail,sum_head+x,sum_tail);
ans[head]=;
}
x=a[num]-sum_tail;
if(x>=&&x<=&&book[x]==)
{
ans[tail]=x;
dfs(num+,head,tail-,sum_head,sum_tail+x);
ans[tail]=;
}
}
}
signed main()
{
n=read();
rep(i,,*n) a[i]=read();
sort(a+,a+*n+);
m=read();
rep(i,,m)
{
int x=read();
book[x]=;
}
dfs(,,n,,);
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)
LOJ P10249 weight 题解的更多相关文章
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- LOJ P10013 曲线 题解
每日一题 day38 打卡 Analysis 这道题运用的是三分,就是说具有一定的单调性,找最大最小值,然后和二分基本类似,就是说特性就是说当前两个点比较,较优的点和最优点在相对了较差点的同侧,就是说 ...
- LOJ P10002 喷水装置 题解
每日一题 day35 打卡 Analysis 先将不符合条件的区间去掉(即半径小于W,不然宽度无法符合),将符合条件的按区间存入节点中.区间的左边界是x-sqrt(r*r-W*W/4.0),要计算x轴 ...
- LOJ P10016 灯泡 题解
每日一题 day50 打卡 Analysis 用初中学的相似推一波式子,再用三分一搞就好了. #include<iostream> #include<cstdio> #incl ...
- LOJ P10015 扩散 题解
每日一题 day49 打卡 Analysis 用dis数组记录每两个点之间的时间,再用一个传递闭包来维护最小的时间就好了 #include<iostream> #include<cs ...
- CF827D Best Edge Weight 题解
题意: 给定一个点数为 n,边数为 m,权值不超过 \(10^9\) 的带权连通图,没有自环与重边. 现在要求对于每一条边求出,这条边的边权最大为多少时,它还能出现在所有可能的最小生成树上,如果对于任 ...
- LOJ 10214 计算器 题解
题面 k==1时,快速幂就好了: k==2时,exgcd就好了,但要注意取模范围的控制: k==3时,BSGS可以解决高次同余方程: 然后就可以开心的A掉了,但要注意特殊情况的特判 #include ...
- 【网络流24题】最长k可重线段集(费用流)
[网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
- 【网络流24题】最长k可重区间集(费用流)
[网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...
随机推荐
- 一、docker 入坑(win10和Ubuntu 安装)
前言 终究还是绕不过去了,要学的知识真的是太多了,好在我们还有时间,docker 之前只闻其声,不曾真正的接触过,现在docker 越来越火,很多公司也都开始使用了.所以对于我们程序员而言,又得修炼一 ...
- HTML+CSS综合练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mybatis事物浅谈
本篇文章主要对Mybatis事物进行基础的介绍.先回顾JDBC事物,再了解Mybatis里面的事物应用. 1.JDBC的事务管理回顾 JDBC的事务管理是基于Connection对象实现的: 开启事务 ...
- C# 从注册表判断指定ocx控件是否已注册 以及获取它的注册路径
/// <summary> /// 注册控件 /// </summary> /// <returns></returns> public bool Re ...
- pandas-21 Series和Dataframe的画图方法
pandas-21 Series和Dataframe的画图方法 ### 前言 在pandas中,无论是series还是dataframe都内置了.plot()方法,可以结合plt.show()进行很方 ...
- 【转载】 C#中ArrayList集合类的使用
在C#的集合操作过程中,我们一般常用的集合类为List集合,List集合是一种强类型的泛型集合,其实还有一个ArrayList集合类,ArrayList集合类则非泛型类的集合,并且ArrayList集 ...
- 【转载】C#通过Remove方法移除DataTable中的某一列数据
在C#中的Datatable数据变量的操作过程中,有时候我们需要移除当前DataTable变量中的某一列的数据,此时我们就需要使用到DataTable变量内部的Columns属性变量的Remove方法 ...
- Promise介绍及使用场景
Promise 介绍 Promise 是一个构造函数,是异步编程的一种解决方案.所谓Promse,它本身就是一个容器,里面保存着异步操作的结果,对的,这和回调函数类似. Promise 容器本身不是异 ...
- 关于DataX
1. 关于DataX 1.1. 前言 为什么写这篇文章,因为初出茅庐的时候,曾经遇到的一个面试官就是DataX的作者之一,而当时我还偏偏因为业务需求做了个数据库的同步工具,我当时不知道他做过这么专业的 ...
- 下拉菜单旋转出现css
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...