zoukankan      html  css  js  c++  java
  • CF 366E Dima and Magic Guitar(最远哈密顿距离)

    题目链接:http://codeforces.com/problemset/problem/366/E

    题意:给出一个n*m的数字矩阵A,每个矩阵元素的范围[1,K]。给出一个长度为s的数字串B,B的每个元素的范围[1,K]。将B中的每个元素t用A中的一个位置(i,j)代替,满足A[i][j]=B[t]。这样就得到一个长度为s的位置序列。定义相邻两个位置的距离为曼哈顿距离,定义序列的最大距离为每两个相邻元素距离最大值。求一种替换方案使得序列的最大距离最大。

    思路:最后转化成两个位置集合S1,S2,使得从S1、S2中各拿出一个元素使得曼哈顿距离最大。设两个点A(x1,y1),B(x2,y2),。因为是绝对值,所以|x1-x2|+|y1-y2|就是
    (x1-x2)+(y1-y2)
    -(x1-x2)+(y1-y2)
    (x1-x2)-(y1-y2)
    -(x1-x2)-(y1-y2)

    中的最大值。因此我们对于每个位置(x,y)记录x+y,x-y,-x+y,-x-y。也就是将所有点分四种保存。那么两个点距离的最大值必然在某一种中为两个数的差值。

    int n,m,K,s,a[N][N];
    set<int> S[10][4];
    int b[100005],c[10][10];
    
    int main()
    {
        Rush(n)
        {
            RD(m,K,s);
            int i,j,k;
            FOR0(i,10) FOR0(j,4) S[i][j].clear();
            FOR1(i,n) FOR1(j,m)
            {
                int x;
                RD(x);
                S[x][0].insert(-i-j);
                S[x][1].insert(-i+j);
                S[x][2].insert(i-j);
                S[x][3].insert(i+j);
            }
            clr(c,0);
            FOR1(i,s)
            {
                RD(b[i]);
                if(i>1) c[b[i]][b[i-1]]=c[b[i-1]][b[i]]=1;
            }
            int ans=0;
            set<int>::iterator it;
            FOR1(i,9) FOR1(j,9) if(c[i][j])
            {
                FOR0(k,4) for(it=S[i][k].begin();it!=S[i][k].end();it++)
                {
                    upMax(ans,abs(*it-*S[j][k].rbegin()));
                    upMax(ans,abs(*it-*S[j][k].begin()));
                }
            }
            PR(ans);
        }
    }
    

      

  • 相关阅读:
    对树的操作(二叉树)
    数据结构之树
    数据结构
    unix网络编程之listen()详解
    算法基础
    哈希表工作原理
    数据结构之栈
    2014年9月面试汇总
    面试知识必备
    JavaScript之JS的执行环境和作用域
  • 原文地址:https://www.cnblogs.com/jianglangcaijin/p/3441319.html
Copyright © 2011-2022 走看看