首页 > 其他分享 >D - Robot Arms 2 -- ATCODER

D - Robot Arms 2 -- ATCODER

时间:2022-10-24 09:55:23浏览次数:56  
标签:ATCODER fx -- fy Robot int prev true xsteps

D - Robot Arms 2

题目 : https://atcoder.jp/contests/abc274/tasks/abc274_d

参考: https://zhuanlan.zhihu.com/p/576281206

 

分析

dfs或者bfs最大复杂度 2^1000, 超时必然的。

采用内存换时间的方法, dp 动态规划, 打表计算每一步执行后,可能到达的坐标。

 

由于目标位置为二维空间上的一点, 分为两个分量, X方向和y方向;

那么 第一步,第三步,第五步,... 奇数步骤都是在x方向是进行移动;

第二步,第四步,第六步,... 偶数步骤都是在y方向上进行移动。

 

需要建立两张表,进行追踪每个步骤后移动到的目标位置;最终判断表中在目标位置是否可达。

 

code

https://atcoder.jp/contests/abc274/submissions/35927313

const int N = 1005;
const int SPACE = 20010;
int n, x, y;
int xsteps[N];
int ysteps[N];
 
int xindex = 0;
int yindex = 0;
 
map<int, map<int, bool>> fx;
map<int, map<int, bool>> fy;
 
 
int main()
{
    cin >> n >> x >> y;
 
    for(int i=0; i<n; i++){
        if (i % 2 == 0){
            cin >> xsteps[++xindex];
        } else {
            cin >> ysteps[++yindex];
        }
    }
 
    // after step one in x direction
    // get offset xsteps[1];
    fx[1][xsteps[1]] = true;
 
    // initial status in y direction
    // get offset 0;
    fy[0][0] = true;
    
    // skip step one in x direction
    for(int i=2; i<=xindex; i++){
        int xi = xsteps[i];
        
        // based on i-1 status, move xi
        // calculate i status
        map<int, bool> fx_prev = fx[i-1];
        map<int, bool>::iterator it;
        for(it=fx_prev.begin(); it!=fx_prev.end(); it++){
            int j = it->first;
 
            int left = j - xi;
            int right = j + xi;
 
            fx[i][left] = true;
            fx[i][right] = true;
        }
    }
 
    for(int i=1; i<=yindex; i++){
        int yi = ysteps[i];
//        cout << "i=" << i << " yi=" << yi << endl;
 
        // based on i-1 status, move yi
        // calculate i status
        map<int, bool> fy_prev = fy[i-1];
        map<int, bool>::iterator it;
        for(it=fy_prev.begin(); it!=fy_prev.end(); it++){
            int j = it->first;
 
            int up = j + yi;
            int down = j - yi;
 
            fy[i][down] = true;
            fy[i][up] = true;
        }
    }
 
//    cout << "fx[xindex][x] = " << fx[xindex][x] << endl;
//    cout << "fy[yindex][y] = " << fy[yindex][y] << endl;
 
//    for(int i=0; i<10000; i++){
//        if (fy[xindex][i] == false){
//            continue;
//        }
//
//        cout << "!!fy[xindex][" << i << "] = " << fy[xindex][i] << endl;
//    }
 
    if (fx[xindex][x] && fy[yindex][y]){
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }
 
    return 0;
}
 

 

标签:ATCODER,fx,--,fy,Robot,int,prev,true,xsteps
From: https://www.cnblogs.com/lightsong/p/16820522.html

相关文章

  • json模块
    目录json模块简介json.dumps()、json.loads()json.dump()、json.load()json模块简介不同的编程语言之间的数据无法直接交互,需要中间有一个翻译官就是json模块。所有......
  • 搭建在线协作编辑器EtherPad使用说明
     https://blog.csdn.net/f4761/article/details/96829784 https://blog.csdn.net/lian740930980/article/details/126306807执行apt-getupdate,出现标题报错,原因是do......
  • JavaScript发展史和JavaScript语法与html结合方式
    JavaScript发展史JavaScript发展史:1.1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为:C--,后来更名为:ScriptEase2.1995年,Netscape(网景)......
  • 表单内容数据回显的具体实现
    以修改功能为例,具体实现一下数据回显(以第七次人口普查测试为例)第一个界面:update.jsp主要用于输入你想要修改的户主姓名,然后点击提交,跳转到updateMain.java的servlet里面,......
  • Dubbo 原理和机制详解 (非常全面)
    Dubbo是一款JavaRPC框架,致力于提供高性能的RPC远程服务调用方案。作为主流的微服务框架之一,Dubbo 为开发人员带来了非常多的便利。大家好,我是 mikechen,专注分享「......
  • hash 表
    Hash表1E5个数,数据范围在1E-9到1E9,需要查找某个数,Hash表用接近O(1)的时间办到,进行映射,取模,映射到某个数,模谁呢,这个数一般是比较大的质数,这样矛盾的概率就比较小。拉链法......
  • 公众号文章里的qq音乐如何批量下载
    公众号文章里的qq音乐如何批量下载 打开的文章内,播放音乐,注意开发者工具中,网络选项卡中,有media类型的请求.那就是音乐.那么这条media的请求,就是音乐地址.https://......
  • vue3 ref 循环多个时候用法
       ......
  • loj3053
    引言它还是来了。这题我尝试写过一次,寄了。然后开摆了。现在决定重新补一补这题。敬请收看:myee调长剖调到CSP还没有调出来的惨状!欢迎来看我什么时候补掉。当然也可......
  • 《上海悠悠接口自动化平台》-2.extract 提取结果与validate 校验结果
    前言当接口请求成功后,返回的内容,我们需要提取内容,并校验实际结果与预期结果是否一致。平台可以支持3种方式提取结果1.body.key方式根据属性点的方式提取,或者下标取值b......