zoukankan      html  css  js  c++  java
  • Bender Problem

    Robot Bender decided to make Fray a birthday present. He drove n nails and numbered them from 1 to n in some order. Bender decided to make a picture using metal rods. The picture is a closed polyline, which vertices should be nails (in the given order). The segments of the polyline should be parallel to the coordinate axes. Polyline is allowed to have self-intersections. Bender can take a rod and fold it exactly once in any place to form an angle of 90 degrees. Then he can attach the place of the fold to some unoccupied nail and attach two ends of this rod to adjacent nails. A nail is considered unoccupied if there is no rod attached to it (neither by it's end nor the by the fold place). No rod could be used twice. It is not required to use all the rods.

    Help Bender to solve this difficult task.

    Input

    The first line contains two positive integers n and m (4 ≤ n ≤ 500, 2 ≤ m ≤ 500, n is even) — the amount of nails and the amount of rods. i-th of the following n lines contains a pair of integers, denoting the coordinates of the i-th nail. Nails should be connected in the same order as they are given in the input. The last line contains m integers — the lenghts of the rods. All coordinates do not exceed 104 by absolute value. Lengths of the rods are between 1 and 200 000. No rod can be used twice. It is guaranteed that all segments of the given polyline are parallel to coordinate axes. No three consecutive nails lie on the same line.

    Output

    If it is impossible to solve Bender's problem, output NO. Otherwise, output YES in the first line, and in the second line output n numbers — i-th of them should be the number of rod, which fold place is attached to the i-th nail, or -1, if there is no such rod.

    If there are multiple solutions, print any of them.

    Example
    Input
    4 2
    0 0
    0 2
    2 2
    2 0
    4 4
    Output
    YES
    1 -1 2 -1
    Input
    6 3
    0 0
    1 0
    1 1
    2 1
    2 2
    0 2
    3 2 3
    Output
    YES
    1 -1 2 -1 3 -1
    Input
    6 3
    0 0
    1 0
    1 1
    2 1
    2 2
    0 2
    2 2 3
    Output
    NO

    用rods把nails框起来,每个rod只能折叠一次,所以如果一个rod在第i个nail处折叠,那么第i+1个就不是折叠的,nail按顺序给出,只需要枚举奇数或者偶数点,看是否满足,注意初始条件。
    代码:
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #define Max 505
    using namespace std;
    int x[Max],y[Max],rod[Max],ans[Max];
    bool vis[Max],flag;
    int n,m;
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i = 0;i < n;i ++)
        {
            scanf("%d%d",&x[i],&y[i]);
        }
        for(int i = 0;i < m;i ++)
        {
            scanf("%d",&rod[i]);
        }
        for(int i = 0;i < 2;i ++)
        {
            memset(ans,-1,sizeof(ans));///方便输出(没有折叠就输出-1) 和 判断是否折叠
            memset(vis,false,sizeof(vis));
            flag = true;
            for(int j = i;j < n;j += 2)
            {
                int d = (abs(x[j] - x[(j + n - 1) % n]) + abs(y[j] - y[(j + n - 1) % n])) + (abs(x[j] - x[(j + 1) % n]) + abs(y[j] - y[(j + 1) % n]));///前一个钉子到这个钉子以及后一个钉子到这个钉子的距离
                for(int k = 0;k < m;k ++)
                {
                    if(rod[k] == d && !vis[k])
                    {
                        vis[k] = true;
                        ans[j] = k + 1;
                        break;
                    }
                }
                if(ans[j] == -1)
                {
                    flag = false;
                    break;
                }
            }
            if(flag)break;
        }
        if(!flag)printf("NO");
        else
        {
            printf("YES
    %d",ans[0]);
            for(int i = 1;i < n;i ++)
                printf(" %d",ans[i]);
        }
    }
  • 相关阅读:
    codeblocks 配置
    2020-7-28
    echarts markPoint在极坐标散点图中不显示value值
    Oracle cve 2020-14644 分析利用以及回显思路
    Openfire Admin Console SSRF&任意文件读取漏洞 CVE-2019-18394 CVE-2019-18393 poc
    Shiro 回显利用工具(burp
    java反序列化提取payload之Xray高级版的shiro回显poc的提取过程
    CVE-2020-3452 CISCO ASA远程任意文件读取 poc
    记事本陈列-历届数学建模大赛优秀论文(含国赛、美赛、研赛)目录
    懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
  • 原文地址:https://www.cnblogs.com/8023spz/p/8447285.html
Copyright © 2011-2022 走看看