热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ABC221GJumpingsequence题解

题面题意简述:给定一个长度为\(n\)的序列\(D,\)对于每一个\(i\)可以选择向一个方向走长度为\(D_i\),问是否能走到\((A,B)\)。\(\texttt{DataR

题面

题意简述:


给定一个长度为 \(n\) 的序列 \(D,\)对于每一个 \(i\) 可以选择向一个方向走长度为 \(D_i\),问是否能走到 \((A,B)\)。

\(\texttt{Data Range:} 1\le n\le 2000,1\le D_i\le 1800,|A|,|B|\le 3.6\times 10^6\)。


首先把曼哈顿距离转化为切比雪夫距离 \((A,B)\rightarrow(A+B,A-B)\)。这样我们就将 \(x\),\(y\) 两维独立了。

对于操作,可以转化成如下形式:



  • up:\((0,d)\rightarrow(-d,d)\);

  • down:\((0,-d)\rightarrow(d,-d)\);

  • left:\((-d,0)\rightarrow(-d,-d)\);

  • right:\((d,0)\rightarrow(d,d)\)。

因此,问题就转化成:


给定 \(n\) 个正整数 \(D_i\),确定一组 \(\{C_i\}\) 使得 \(\sum C_i\times D_i=s\),其中 \(C_i\in\{1,-1\}\)。


假设 \(C_i=1\) 的数的和为 \(a\),\(C_i=-1\) 的数的和为 \(b\),所有数的和为 \(sum\),那么就有:

\[\begin{aligned}
a-b&=s\\
b&=a-s\\
b&=sum-b-s\\
2b&=sum-s
\end{aligned}
\]

先把 \(sum-s\) 为奇数的情况判掉,然后跑一遍 bitset 优化 01 背包即可。

代码:

#include
#define DC int T = gi (); while (T--)
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define File(x) freopen(x".in","r",stdin); freopen(x".out","w",stdout)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair PII;
typedef pair PLL;
template
inline T gi()
{
T x = 0, f = 1; char c = getchar();
while (c <'0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return f * x;
}
const int N = 2003, M = N <<1;
int n, a, b;
int d[N];
int sum;
bitset <3600003> f[N];
bool ans[N][2];
int main()
{
//freopen(".in", "r", stdin); freopen(".out", "w", stdout);
n = gi (), a = gi (), b = gi ();
f[0][0] = 1;
for (int i = 1; i <= n; i+=1)
d[i] = gi (), sum += d[i], f[i] = f[i - 1] | (f[i - 1] < int x = a + b, y = a - b;
if (x <-sum || x > sum || y <-sum || y > sum || ((sum - x) & 1) || ((sum - y) & 1)) return puts("No"), 0;
x = sum - x, y = sum - y;
x >>= 1, y >>= 1;
if (!f[n][x] || !f[n][y]) return puts("No"), 0;
int tmpx = x, tmpy = y;
for (int i = n; i >= 1; i-=1)
{
if (tmpx >= d[i] && f[i - 1][tmpx - d[i]]) ans[i][0] = false, tmpx -= d[i];
else ans[i][0] = true;
if (tmpy >= d[i] && f[i - 1][tmpy - d[i]]) ans[i][1] = false, tmpy -= d[i];
else ans[i][1] = true;
}
puts("Yes");
for (int i = 1; i <= n; i+=1)
if (ans[i][0])
{
if (ans[i][1]) cout <<'R';
else cout <<'U';
}
else
{
if (ans[i][1]) cout <<'D';
else cout <<'L';
}
return !!0;
}

启发:



  • 看到曼哈顿距离,马上考虑转成切比雪夫距离,这样可以将两维问题独立。

  • 要有一定的推式子能力。



推荐阅读
  • 796.[APIO2012]派遣在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿。在这个帮派里,有一名忍者被称之为Master。 ... [详细]
  • 题目描述Takuru是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。Takuru的计划是让Hinae帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takur ... [详细]
  • 题面传送门Solution看到什么最大值最小肯定二分啊。check直接跑一个二分图匹配就好了。orzztl!!!代码实现*mail:mle ... [详细]
  • C语言函数的定义及其含义
    本文目录一览:1、C语言函数的特点及其定义?2 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  •   并查集是一种群众喜闻乐见的数据结构,其复杂度是数据结构中最奇葩的之一了,Tarjan证明其为阿克曼函数的反函数,在可以想象(不全面的解释啊)的范围内小于等于3。。。我们就把它当做O(1)吧。下面通 ... [详细]
  • 为什么即使Linux服务器的socket关闭,客户端仍能调用一次send函数?
    要弄清这个问题,首先需要知道调用send()发送数据时,发生了什么。当调用send()发送数据时,并不是直接将数据发送到网络中,而是先将待发送的数据放到socket发送缓冲区中,然 ... [详细]
  • 捕获图像,用KMPlayer很容易实现。编码,用了强大的maltab生成3000多张用于播放的字符文本。图像的标号为1(1) ... [详细]
  • 一.  一就是用来乱扯的?#include<bitsstdc++.h>万能头文件#definefr(i,a,b)for(intia,_end_b;i<_en ... [详细]
  • 昨夜西风凋碧树,独上高楼,望尽天涯路。——五代晏殊蝶恋花最近学习了APUE的一系列函数,要求用ifconfig命令来获取本机的网卡ip&# ... [详细]
author-avatar
mobiledu2502909533
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有