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
  • Working routine【Codeforces 706 E】【二维链表】

    Codeforces Round 367 Div 2 E 可以说是一道模拟题了 写了有些时候 可能是太菜了吧 题意 给出一个原始矩阵 之后有Q次操作 我们将两个矩阵交换位置 题目中保证两个矩阵不相交 给出的是两个矩阵的左上方的端点 以及它们
  • Polycarp and Div 3【Codeforces Round #496 (Div. 3)【D题】】【贪心】

    应该说是今天凌晨的吧 第一次打Code Forces 懵懵懂懂的 不过感觉还是良好 做了几道签到题 难题还是没有那个水准去做 Polycarp likes numbers that are divisible by 3 He has a h
  • New Year and Social Network【Hello 2020 F】【拓扑+LCA+贪心】

    题目链接 看到比赛的时候zzq大聚聚用了LCT做的 在线 首先 我们可以发现 两棵大小相同 构造形状不同的树 一定是可以用另一棵树的边来维持这棵树上的每一个点的相互连通性的 我的做法 就是基于这样展开的 我们有T1 T2两棵树 现在我们要去
  • Basic Level 1012 数字分类 (20分)

    题目 给定一系列正整数 请按要求对数字进行分类 并输出以下 5 个数字 A 1 A 1 A1 能被 5 整除的数字中所有偶数的和 A 2
  • 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
  • River Jumping【贪心+模拟】

    题目链接 我们可以贪心的从前往后 每次选最接近的且满足条件的这样的贪心 然后从后往前的时候 就是直接用倒着一个个判断是否合法即可 include
  • NYOJ 586 疯牛 & POJ 2456(二分搜索 + 贪心)

    疯牛 时间限制 1000 ms 内存限制 65535 KB 难度 4 描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000
  • 【寒假每日一题】蛇形矩阵

    问题1 题目来源 AcWing 题目链接 756 蛇形矩阵 AcWing题库 题目描述 输入两个整数 n 和 m 输出一个 n 行 m 列的矩阵 将数字 1 到 n m 按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行
  • AcWing4908. 饥饿的牛

    输入样例1 1 5 1 2 输出样例1 2 样例1解释 两捆干草在第 11 天早上被送到了牛棚 所以贝茜第 1 2 天有干草吃 输入样例2 2 5 1 2 5 10 输出样例2 3 样例2解释 两捆干草在第 1 天早上被送到了牛棚 所以贝茜
  • 洛谷P1182-数列分段(详解)

    题目 给定一个长度为n的数列A 要求将它分为m段 要求每段连续 且每段和的最大值最小 N lt 10e5 m lt n Ai之和不超过10e9 这题一看就知道我不会 所以很老实的去看了看题解 题解也真是避重就轻 重要的地方就说 这个要自己思
  • 【暑期每日一题】洛谷 P6437 [COCI2011-2012#6] JACK

    题目链接 P6437 COCI2011 2012 6 JACK 洛谷 计算机科学教育新生态 luogu com cn 题目描述 给定 n 个正整数 a1 an 请从中选择 3 个数字 满足他们的和不大于给定的整数 m 请求出这个和最大可能是
  • [leetcode] 球会落何处 模拟

    给出一个矩阵 里面的值为 1 or 1 1的时候是从左上到右下 1的时候是从左下到右上 当一个球从上方x 0 lt x lt m 放入之后 从哪个出口掉落还是无法从出口掉落 能通过的情况为 即某条线为 其左边的线也是 箭头所指为当前斜线 即
  • 货仓选址(贪心)

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

    猜数字小游戏 题目描述 代码 运行效果 新增功能 思路 代码 运行效果 题目描述 猜数字 又称 Bulls and Cows 是一种古老的的密码破译类益智类小游戏 起源于20世纪中期 一般由两个人或多人玩 也可以由一个人和电脑玩 通常由两个
  • +-字符串(简单贪心)

    字符串 时间限制 1000 ms 内存限制 65535 KB 难度 1 描述 Shiva得到了两个只有加号和减号的字符串 字串长度相同 Shiva一次可以把一个加号和它相邻的减号交换 他想知道最少需要多少次操作才能把第一个字符串变换成第二个
  • AcWing 1247. 后缀表达式

    老师的讲课网址 https www acwing com video 736 第二个图就已经告诉我们只要有一个减号 我们就可以组成至少含一个减号的所有组合 比如说一个减号三个加号我们可以组合成 1 2 3 4 所以代码如下 include
  • 编程之美2015初赛第二场AB

    题目1 扑克牌 时间限制 2000ms 单点时限 1000ms 内存限制 256MB 描述 一副不含王的扑克牌由52张牌组成 由红桃 黑桃 梅花 方块4组牌组成 每组13张不同的面值 现在给定52张牌中的若干张 请计算将它们排成一列 相邻的

随机推荐

  • 字符串流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小游戏除草游戏 以前玩过的一个小游戏倒是让我对这道题的解法有了方