Acesrc and Hunting【模拟 贪心】

2023-11-04

HDU - 6660 题目链接


  这道题主要就是讲我们从任意点出发,每次走的都是没走过并且,曼哈顿距离大于1小于3的点,然后问能不能覆盖完整幅图。

  这里就想到一个很经典的问题,(4399小游戏除草游戏???)以前玩过的一个小游戏倒是让我对这道题的解法有了方向的感觉,感觉每个点都有自己的稳定下一个点,固定方向(虽然答案不唯一)。

  我们先把最上面一行走完,然后按照蛇(S)形走位……就可以了。但是我们这道题中是有限制的,我们不能一个一个点的走,不妨我们根据点的奇偶性,假设第一个点是(1,1)那么就是白色偶数点,假设(3,2)这个点就是黑色奇数点,这类意思。然后白子按照刚才的走法,黑子考虑最后两排是要交替着走还是继续按照刚才的规矩S形走。

  代码量比较的长,但是附上了对应的注释……QAQ

代码量极度下降的贪心搜索思想!!!

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define efs 1e-6
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define max3(a, b, c) max(a, max(b, c))
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
int N, M;
inline bool In_map(int x, int y) { return x > 0 && y > 0 && x <= N && y <= M; }
pair<int, int> nex[105][105];
bool vis[105][105];
struct node
{
    int x, y;
    node(int a=0, int b=0):x(a), y(b) {}
};
int top, Stop;
node Que[105 * 105], Stap[105 * 105];
inline void init()
{
    top = Stop = 0;
    for(int i=1; i<=N; i++) for(int j=1; j<=M; j++) vis[i][j] = false;
    for(int i=1; i<=N; i++) nex[i][1] = nex[i][2] = MP(0, 0);   //初始化
    int i = 1;
    //先白
    for(i = 1; i + 2 <= M; i += 2) nex[1][i] = MP(1, i + 2);
    if(N == 2)
    {
        int st = 0;
        if(M & 1) { nex[1][M] = MP(2, M - 1); st = M - 1; }
        else { nex[1][M - 1] = MP(2, M); st = M; }
        for(; st - 2 >= 1; st -= 2) nex[2][st] = MP(2, st - 2);
        //nex[2][st] = MP(1, 1);    //白就不需要回归到原点构成环的操作了
    }
    else    // N≥3
    {
        int beg;
        if(M & 1)   //第一排最后一个是白
        {
            nex[1][M] = MP(3, M);
            for(int j = M; j >= 1; j--) //白子可以顺走,黑子最后的两排需要判断
            {
                if( (M - j) & 1 )
                {
                    beg = N & 1 ? N - 1 : N;
                    for( ; beg - 2 >= 2; beg -= 2)
                    {
                        nex[beg][j] = MP(beg - 2, j);
                    }
                    nex[2][j] = MP(3, j - 1);
                }
                else
                {
                    beg = 3;
                    for( ; beg + 2 <= N; beg += 2)
                    {
                        nex[beg][j] = MP(beg + 2, j);
                    }
                    if(N & 1) nex[beg][j] = MP(beg - 1, j - 1);
                    else nex[beg][j] = MP(beg + 1, j - 1);
                }
            }
        }
        else    //第一排最后一个是黑
        {
            nex[1][M - 1] = MP(2, M);
            for(int j = M; j >= 1; j--) //白子可以顺走,黑子最后的两排需要判断
            {
                if( (M - j) & 1 )
                {
                    beg = N & 1 ? N : N - 1;
                    for( ; beg - 2 >= 2; beg -= 2)
                    {
                        nex[beg][j] = MP(beg - 2, j);
                    }
                    nex[beg][j] = MP(beg - 1, j - 1);
                }
                else
                {
                    beg = 2;
                    for( ; beg + 2 <= N; beg += 2)
                    {
                        nex[beg][j] = MP(beg + 2, j);
                    }
                    if(N & 1) nex[beg][j] = MP(beg + 1, j - 1);
                    else nex[beg][j] = MP(beg - 1, j - 1);
                }
            }
        }
    }
    //后黑
    for(i = 2; i + 2 <= M; i += 2) nex[1][i] = MP(1, i + 2);
    if(N == 2)
    {
        int st = 0;
        if(M & 1) { nex[1][M - 1] = MP(2, M); st = M; } //第一排最后一个是白
        else { nex[1][M] = MP(2, M - 1); st = M - 1; }  //同时找到st的开始点,此时的黑,需要去构成环
        for(; st - 2 >= 1; st -= 2) nex[2][st] = MP(2, st - 2);
        nex[2][st] = MP(1, 2);
    }
    else    //现在是 N ≥ 3
    {
        int beg;
        if(M & 1)   //第一排最后一个是白,并且如果M是奇数,意味着 M ≥ 3
        {
            nex[1][M - 1] = MP(2, M);
            for(int j = M; j >= 3; j --)
            {
                if( (M - j) & 1 )
                {
                    beg = N & 1 ? N : N - 1;
                    for(; beg - 2 >= 2; beg -= 2)
                    {
                        nex[beg][j] = MP(beg - 2, j);
                    }
                    nex[3][j] = MP(2, j - 1);
                }
                else
                {
                    beg = 2;
                    for(; beg + 2 <= N; beg += 2)
                    {
                        nex[beg][j] = MP(beg + 2, j);
                    }
                    if(N & 1) nex[beg][j] = MP(N, j - 1);
                    else nex[beg][j] = MP(N - 1, j - 1);
                }
            }
            if(N & 1)
            {
                for(int k = N; k >= 3; k--)
                {
                    if(k & 1) nex[k][2] = MP(k - 1, 1);
                    else nex[k][1] = MP(k - 1, 2);
                }
                nex[2][1] = MP(1, 2);
            }
            else
            {
                nex[N - 1][2] = MP(N, 1);
                nex[N][1] = MP(N - 2, 1);
                for(int k = N - 2; k >= 3; k--)
                {
                    if(k & 1) nex[k][2] = MP(k - 1, 1);
                    else nex[k][1] = MP(k - 1, 2);
                }
                nex[2][1] = MP(1, 2);
            }
        }
        else    //第一排最后一个是黑
        {
            nex[1][M] = MP(3, M);
            for(int j = M; j >= 1; j--)
            {
                if( (M - j) & 1 )
                {
                    beg = N & 1 ? N - 1 : N;
                    for(; beg + 2 >= 2; beg -= 2)
                    {
                        nex[beg][j] = MP(beg - 2, j);
                    }
                    nex[2][j] = MP(3, j - 1);
                }
                else
                {
                    beg = 3;
                    for(; beg + 2 <= N; beg += 2)
                    {
                        nex[beg][j] = MP(beg + 2, j);
                    }
                    if(N & 1) nex[beg][j] = MP(beg - 1, j - 1);
                    else nex[beg][j] = MP(beg + 1, j - 1);
                }
            }
            nex[2][1] = MP(1, 2);
        }
    }
}
int main()
{
    int Cas; scanf("%d", &Cas);
    while(Cas--)
    {
        scanf("%d%d", &N, &M);
        init();
        if(N == 1 && M == 1)
        {
            printf("YES\n");
            printf("1 1\n");
            continue;
        }
        if(N == 1 || M == 1)
        {
            printf("NO\n");
            continue;
        }
        if(N == 2 && M == 2)
        {
            printf("NO\n");
            continue;
        }
        init();
        printf("YES\n");
        if(In_map(3, 2))
        {
            int x = 1, y = 1, tx, ty;
            Que[++top] = node(x, y);
            while(nex[x][y].first && nex[x][y].second)
            {
                tx = nex[x][y].first; ty = nex[x][y].second;
                Que[++top] = node(tx, ty);
                x = tx; y = ty;
            }
            x = 3; y = 2;
            vis[x][y] = true;
            Stap[++Stop] = node(x, y);
            while(!vis[nex[x][y].first][nex[x][y].second])
            {
                tx = nex[x][y].first; ty = nex[x][y].second;
                vis[tx][ty] = true;
                Stap[++Stop] = node(tx, ty);
                x = tx; y = ty;
            }
            for(int i=Stop; i>=1; i--) printf("%d %d\n", Stap[i].x, Stap[i].y);
            for(int i=1; i<=top; i++) printf("%d %d\n", Que[i].x, Que[i].y);
        }
        else if(In_map(2, 3))
        {
            int x = 1, y = 1, tx, ty;
            Que[++top] = node(x, y);
            while(nex[x][y].first && nex[x][y].second)
            {
                tx = nex[x][y].first; ty = nex[x][y].second;
                Que[++top] = node(tx, ty);
                x = tx; y = ty;
            }
            x = 2; y = 3;
            vis[x][y] = true;
            Stap[++Stop] = node(x, y);
            while(!vis[nex[x][y].first][nex[x][y].second])
            {
                tx = nex[x][y].first; ty = nex[x][y].second;
                vis[tx][ty] = true;
                Stap[++Stop] = node(tx, ty);
                x = tx; y = ty;
            }
            for(int i=Stop; i>=1; i--) printf("%d %d\n", Stap[i].x, Stap[i].y);
            for(int i=1; i<=top; i++) printf("%d %d\n", Que[i].x, Que[i].y);
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Acesrc and Hunting【模拟 贪心】 的相关文章

  • Basic Level 1010 一元多项式求导 (25分)

    题目 设计函数求一元多项式的导数 注 x n x n xn n为整数 的一阶导数为 n x n
  • P1016 旅行家的预算【模拟+贪心】【详解】

    题目链接 思路 这道题是一道很明显的模拟题 但这道题也需要自己的理解 我自己写了些样例 然后找到了其中的模拟 我们假设从一个点出发 对于它的下一个点我们有很多选择 期间定义一个len用以记录满油 单次最远 到达距离 我们造访这条路上的所有点
  • Acwing-42. 栈的压入、弹出序列

    每一步进行的操作有两种 将下一个数压入栈中 将当前栈顶元素弹出 判断当前栈顶元素是否和下一个要输出的数是一样的 一样 gt 必然会将当前栈顶元素弹出 不一样 gt 必然会将输入序列的下一个元素加入栈中 class Solution publ
  • 并行程序模拟(ACM/ICPC World Finals 1991)

    附上题目连接 concurrency simulator 本题为紫书数据结构基础篇第一道例题 是一道考察双端队列的模拟题 由于使用了STL 题目的难度和编程量大大降了下来 不过本菜鸟还是花了三个半小时才拿下了这道题 30msAC 可想见代码
  • Pie POJ - 3122【贪心、二分】

    该题连接 这是一道英文题 所以这里就不放原题了 我写一下它的题意 主人要开一个party 而主人有N个派 他要宴请F个人 也就是要有F 1个人要吃派 但这些人又很挑剔 他们每个人吃派只吃一种派 并且还不能容忍其他人吃的派比自己多 所以这就是
  • hdoj 1052 Tian Ji -- The Horse Racing 贪心算法

    这道题就是解决选择策略问题 思路一 先将田忌跟齐王的马的速度数组进行一次冒泡排序 1 如果田忌最慢的马比齐王最慢的马快 则比慢马 2 如果田忌最慢的马比齐王最慢的马慢 则用田最慢的马跟齐最快的马比 消耗齐的快马这是贪心的第一步 3 如果田忌
  • Advanced Leve 1005 Spell It Right (20 point(s))

    Theme Given a non negative integer N your task is to compute the sum of all the digits of N and output every digit of th
  • [NOI2010]超级钢琴【RMQ+贪心+堆】

    题目链接 超级棒的一道题 解这道题 需要分一下几步来看 取的是连续段 我们可以对每个可能起点去知道它的最大可能解 起点begin 最大可行解一定是begin L 1 begin R 1中的一个 如果每次都是取最大的话 那么下一个同起点的一定
  • 紫书《算法竞赛入门经典》

    紫书 算法竞赛入门经典 题目一览 第3章 数组和字符串 例题 UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 340 Master Mind Hints UVA 158
  • HDOJ 1052 Tian Ji -- The Horse Racing

    Tian Ji The Horse Racing Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 2
  • AcWing 104. 货仓选址

    题目 在一条数轴上有 N 家商店 它们的坐标分别为 A1 AN 现在需要在数轴上建立一家货仓 每天清晨 从货仓到每家商店都要运送一车商品 为了提高效率 求把货仓建在何处 可以使得货仓到每家商店的距离之和最小 输入格式 第一行输入整数N 第二
  • Atcoder Beginner Contest 300

    A N choice question AC代码 include
  • Stall Reservations POJ - 3190

    这道题 是学长给我们布置的学习用的题目 重在给我们讲解了什么是优先队列以及其对应的贪心问题 好了 先送上 中文翻译过的题意 手动 滑稽 Oh those picky N 1 lt N lt 50 000 cows They are so p
  • POJ-3253 Fence Repair

    农夫约翰想修理牧场周围的一小段围栏 他测量围栏并认定他需要 1 20000 厚木板 每一个都具有一些整数长度大号我 1 大号我 50000 单元 然后 他购买一块长板足够长 以便看到N块板 即 其长度是长度L i的总和 FJ忽略了 切口 锯
  • 贪心——字典序最小问题

    https vjudge net problem POJ 3617 题目简单理解就是 给定长度为N的字符串为S 要构造一个长度为N的字符串T 起初 T 是一个空串 随后反复进行下列任意操作 从S的头部删除一个字符串 加到T的尾部 从S的尾部
  • 货仓选址(贪心)

    我之前在多篇博客中提到货仓选址 却发现从未仔细介绍过货舱选址 今天就来好好说一下货舱选址这个问题 就以这个图来说 我们假设Ap 1 gt x gt Ap 那么距离之和也就是 x A1 x A2 x Ap A p 1 x A p 2 x An
  • ahut 月赛1

    心得 一点一点理解 对于一段要学习的代码 跟着写下来 理解一点写一点 对于一道题目 用记事本 看题目 看一句题目 用自己的话概括一句 写在记事本上 并将自己的 想法一并写下来 这样做下来 心会很平静 你会发现 理解一段代码并不费力 解决一道
  • LeetCode-1827. 最少操作使数组递增【贪心,数组】

    LeetCode 1827 最少操作使数组递增 贪心 数组 题目描述 解题思路一 简单暴力 解题思路二 优化1 ans是操作数 mx是当前最大元素 mx无论如何会依次递增 解题思路三 优化2 遇到小的数就pre 1 否则变为num 题目描述
  • CSDN竞赛6期题解

    CSDN编程竞赛报名地址 https edu csdn net contest detail 16 请不要删掉此地址 总结 这次竞赛题目比较简单 没多大必要写题解 更多的还是给出自己的一些体会和建议吧 很多同学已经对比赛规则和编程体验给出了
  • Basic Level 1016 部分A+B (15分)

    题目 正整数 A A A的 D A D A DA 为1位整数 部分 定义为由 A

随机推荐

  • 字符串流stringstream--<sstream>

    字符串流stringstream流详解 一 stringstream是C 提供的一个字符串流 与iostream和fstream的操作方法类似 只是功能不同 要使用字符串流必须包含其头文件
  • 小程序开发之搜索框

    日常学习之小程序开发 搜索框 为了完成搜索框 我们先在 pages 文件夹中创建 search 文件并创建相应的 page 搜索框 可以用 vant 组件中的 van search 标签来实现 需要在 miniprogram 文件夹的内建终
  • error: ‘QObject::QObject(const QObject&)’ is private within this context

    error QObject QObject const QObject is private within this context 这个错误是由于QObject类的拷贝构造函数被声明为私有 导致在某些情况下无法进行对象的拷贝操作而产生的
  • 最小费用最大流详解与模板

    最小费用最大流 在最大流有多组解时 给每条边在附上一个单位费用的量 问在满足最大流时的最小费用是多少 思想 给出一个容量网络 那他的最大流一定是一个定值 即使是有多个一样的最大值 所以我们从开始的可行流开始增广时 最终的增广量是一定的 所以
  • 你知道“$set”是什么吗?

    set 的原理是基于Vue的响应式系统和Vue的观察者机制 当使用 set 方法时 它会执行以下步骤来实现动态添加或修改响应式对象的属性 1 首先 set 会检查对象是否已经是响应式的 如果对象未被代理为响应式对象 它会将对象转换为响应式对
  • 机器学习之朴素贝叶斯算法的详解(包含高斯朴素贝特斯、多项式朴素贝叶斯、伯努利朴素贝叶斯,以及相应算法的简单实现)

    机器学习18 贝叶斯算法详解 2021 06 02 2021 06 05 一 朴素贝叶斯算法 为什么需要朴素贝叶斯算法 比如说 我们想预测一个人究竟是否能够侥幸在空难中生还 那么我们就需要建立一个分类模型来学习我们的训练集 在训练集中 其中
  • 学习cocos2d-x 之路 (1)--了解cocos2d-x

    学前感言 很久以前就听说过cocos2d的大名 知道它在手机游戏开发中处于主导地位 但是今天是真正意义上第一次接触 当前手机游戏市场十分火爆 我想对于任何一个对游戏感兴趣并且准备投身手机游戏开发的人学习这款引擎都是必要的 从百度百科上阅读了
  • Linux学习之安装vim软件

    Linux学习之安装vim软件欢迎来到陈冬冬的个人经验分享平台https www chendd cn blog article 1477573897833009153 html 在前一篇文章中初步使用到了 vi 命令去更改网络连接的参数文件
  • 【git系列】从远端仓库获取最新代码合并到本地分支里

    在日常开发中 很有可能几个开发人员都在开发同一个代码仓分支 导致本地分支里的代码 落后于 远端分支里的 我们需要做的就是从远端仓库获取最新代码合并到本地分支里 1 git pull 有风险 获取最新代码到本地 并自动合并到当前分支 首先我们
  • ORB_SLAM2 with XTION的编译问题(1)

    ORB SLAM2 with XTION的编译问题及解决 1 源链接为https github com chaizheng2157 RGBD ORB SLAM2 RT 其中里面有两个包要编译 分别是g2o with orbslam2和ORB
  • matlab做多元门限回归模型,门限自回归模型

    2014年第6期 郑晓亚 我国股权风险溢价的长期趋势与短期特征 我国股权风险溢价的长期趋势与短期特征 结合门限自回归模型与B P多重结构型断点检验的经验研究郑 Hansen 于 1996 年在 Econometrica 上发表文章 Infe
  • Vercel国内无法访问解决方案

    域名解析使用 cname vercel dns com 或 将 A 记录从 76 76 21 21 改成 76 223 126 88 官方建议将 cname 从 cname vercel dns com 修改为 cname china ve
  • python web页面增删改查_python web 增删改查教你快速入门

    1 导入需要的扩展和包from sqlalchemy import create engine Column Integer String from sqlalchemy ext declarative import declarative
  • 数据源 JNDI 作用

    数据源在JDBC中的应用简介众所周知 JDBC Java数据库连接 是Java 2企业版的重要组成部分 它是基于SQL层的API 通过把SQL语句嵌入JDBC接口的方法中 用户可以通过Java程序执行几乎所有的数据库操作 JDBC只提供了接
  • uni-app的Vue.js实现微信小程序的紧急事件登记页面功能

    主要功能实现 完成发生时间选择功能 用户可以通过日期选择器选择事件发生的时间 实现事件类型选择功能 用户可以通过下拉选择框选择事件的类型 添加子养殖场编号输入框 用户可以输入与事件相关的子养殖场编号 完成事件描述输入功能 用户可以通过文本输
  • 1、网易校招2016年《下厨房》

    题目描述 牛牛想尝试一些新的料理 每个料理需要一些不同的材料 问完成所有的料理需要准备多少种不同的材料 输入描述 每个输入包含 1 个测试用例 每个测试用例的第 i 行 表示完成第 i 件料理需要哪些材料 各个材料用空格隔开 输入只包含大写
  • 数据分析实战项目:SQL分析淘宝用户行为

    文章目录 一 项目背景及目的 1 1 项目背景 1 2 项目目的 1 3 数据集来源与介绍 二 数据导入 2 1 图形界面工具导入 2 2 以系统命令行导入 三 数据清洗 3 1 删除重复值 3 2 查看缺失值 3 3 时间格式转换 3 4
  • 赛宁网安有力保障淮安市网络安全技能竞赛决赛

    9月6日 由中共淮安市委网信办 淮安市总工会 淮安市人社局 淮安市教育局 淮安市公安局 共青团淮安市委共同主办 淮阴工学院协办 淮安市网络信息和数据安全协会 淮安市信息安全等级保护工作协调小组办公室承办 中国电信股份有限公司淮安分公司 中国
  • stm32 无刷电机控制板

    stm32f103c8t6 做主控 自制无刷电机 bldc 控制板 支持有感和无感两种模式 可通过硬件切换 内部包含原理图和源代码及照片 文件 url80 ctfile com f 25127180 745426979 e8e3fc p 5
  • Acesrc and Hunting【模拟 贪心】

    HDU 6660 题目链接 这道题主要就是讲我们从任意点出发 每次走的都是没走过并且 曼哈顿距离大于1小于3的点 然后问能不能覆盖完整幅图 这里就想到一个很经典的问题 4399小游戏除草游戏 以前玩过的一个小游戏倒是让我对这道题的解法有了方