当前位置: 首页 > news >正文

Codeforces 1087C Connect Three (思维+模拟)

题意:

网格图选中三个格,让你选中一些格子把这三个格子连起来,使得选中的格子总数最小。最后输出方案

网格范围为1000

思路:

首先两点间连起来最少需要的格子为他们的曼哈顿距离

然后连接方案一定是曼哈顿距离最短的两个点先连上,然后第三个点再接过去

然后题目就是求第三个点接到的那个点pos,答案就是path(a,pos)+path(b,pos)+path(c,pos)

求pos有两种方法

方法一:O(n2)

1e6枚举pos求最短即可,也能过

方法二:O(n)

首先第三个点一定在前两个点组成的矩形之外的,(不然他就不是第三个点了)

POS一定在前两个点组成的矩形的边界上,也是枚举即可。。

我写臭了。。还分了八个象限两种情况写的,可以参考一下添加路径的代码

 

其实比赛就是这样,口嗨能过就赶紧写,想优化说不定会花更长时间

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
    
#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) 

using namespace std;

typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;

const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 2e6+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);

vector<PI>ans;
PI a[4];
int d(PI a, PI b){
    return abs(a.fst-b.fst)+abs(a.sc-b.sc);
}
void link(PI a, PI b){
    int x = a.fst;
    int y = a.sc;
    int dx,dy;
    //printf("a:%d %d\nb:%d %d\n",x,y,b.fst,b.sc);
    while(make_pair(x,y)!=b){
        if(b.fst==x)dx=0;
        else dx=abs(b.fst-x)/(b.fst-x);
        if(b.sc==y)dy=0;
        else dy=abs(b.sc-y)/(b.sc-y);

        if(dx!=0)x+=dx;
        else y+=dy;
        //printf("yeh:%d %d\n",x,y);
        if(x==b.fst&&y==b.sc)break;
        ans.pb(make_pair(x,y));
    }
    return;
}
bool cmp(PI a, PI b){
    if(a.fst==b.fst)return a.sc<b.sc;
    return a.fst < b.fst;
}
int main(){
    for(int i = 1; i <= 3; i++){
        scanf("%d %d", &a[i].fst, &a[i].sc);
        ans.pb(a[i]);
    }

    int d1 = d(a[1],a[2]);
    int d2 = d(a[1],a[3]);
    int d3 = d(a[2],a[3]);
    int dd = min(min(d1,d2),d3);
    if(dd==d3){
        swap(a[1],a[3]);
    }
    else if(dd == d2){
        swap(a[2],a[3]);
    }
    PI pos=make_pair(-1,-1);
    int x1 = min(a[1].fst,a[2].fst);int x2=max(a[1].fst,a[2].fst);
    int y1 = min(a[1].sc,a[2].sc);int y2=max(a[1].sc,a[2].sc);
    for(int i = 1; i <= 3; i++){
        //printf("i:%d %d %d\n",i,a[i].fst,a[i].sc);
    }
    //printf("%d %d %d %d\n",x1,x2,y1,y2);
    for(int dx = 0; dx <= 1000; dx++){
        int x = a[3].fst+dx;
        int y = a[3].sc;
        //printf("  %d %d %d\n",dx,x,y);
        if(x>=x1&&x<=x2&&y>=y1&&y<=y2){
            pos = make_pair(x,y);break;
        }
        x = a[3].fst-dx;
        if(x>=x1&&x<=x2&&y>=y1&&y<=y2){
            pos = make_pair(x,y);break;
        }
    }
    //printf("   %d %d\n",pos.fst,pos.sc);
    for(int dy = 0; dy <= 1000; dy++){
        int x = a[3].fst;
        int y = a[3].sc+dy;
        if(x>=x1&&x<=x2&&y>=y1&&y<=y2){
            pos = make_pair(x,y);break;
        }
        y = a[3].sc-dy;
        if(x>=x1&&x<=x2&&y>=y1&&y<=y2){
            pos = make_pair(x,y);break;
        }
    }//printf("   %d %d\n",pos.fst,pos.sc);
    if(pos.fst==-1){
        PI b[5];
        b[1] = make_pair(x1,y1);
         b[2] = make_pair(x1,y2);
          b[3] = make_pair(x2,y1);
           b[4] = make_pair(x2,y2);
        int ttmp = inf;
        int pp = -1;
        for(int i = 1; i <= 4; i++){
            if(ttmp>d(a[3],b[i])){
                ttmp=d(a[3],b[i]);
                pp=i;
            }
        }
        pos=b[pp];
    }
    //printf("   %d %d\n",pos.fst,pos.sc);
    //printf("  %d\n",ans.size());
    link(a[1],pos);
    link(a[2],pos);
    link(a[3],pos);
    
    if(pos!=a[1]&&pos!=a[2]&&pos!=a[3])ans.pb(pos);
    printf("%d\n",ans.size());
    sort(ans.begin(), ans.end(), cmp);
    for(int i = 0; i < (int)ans.size(); i++){
        printf("%d %d\n",ans[i].fst,ans[i].sc);
    }
    return 0;
}

/*

 */

 

转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/10167285.html

相关文章:

  • 网络图片转换到本地并转换成base64位
  • 最新最全 中文版Pycharm 2017安装教程 Python编译器安装(小白教程)
  • Spring事务管理要点总结
  • flask实现基于elasticsearch的关键词搜索建议
  • MySQL binlog group commit--commit stage
  • 返回多个值的摘要函数
  • 解决MacOS升级后出现xcrun: error: invalid active developer path, missing xcrun的问题
  • 网络流-一江春水向东流
  • lombok @Builder注解使用的例子、反编译之后的代码详解
  • cordova编译crosswalk-webview插件报错的处理办法
  • .NET MVC 验证码
  • Prior Posterior和Likelihood的理解与几种表达方式
  • jQuery.extend 函数使用
  • SpringBoot 缓存01
  • 生活总结
  • Angular Elements 及其运作原理
  • Date型的使用
  • Docker下部署自己的LNMP工作环境
  • exports和module.exports
  • flask接收请求并推入栈
  • JavaScript 一些 DOM 的知识点
  • linux学习笔记
  • nfs客户端进程变D,延伸linux的lock
  • SOFAMosn配置模型
  • 编写符合Python风格的对象
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于游标的分页接口实现
  • 利用DataURL技术在网页上显示图片
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 深入浅出webpack学习(1)--核心概念
  • 使用权重正则化较少模型过拟合
  • 微信小程序填坑清单
  • 一些css基础学习笔记
  • ​2021半年盘点,不想你错过的重磅新书
  • #每日一题合集#牛客JZ23-JZ33
  • #微信小程序:微信小程序常见的配置传旨
  • $forceUpdate()函数
  • $GOPATH/go.mod exists but should not goland
  • (23)Linux的软硬连接
  • (4)STL算法之比较
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (八)Spring源码解析:Spring MVC
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (原創) 物件導向與老子思想 (OO)
  • (转)h264中avc和flv数据的解析
  • (转)Oracle存储过程编写经验和优化措施
  • .net 4.0发布后不能正常显示图片问题
  • .NET Micro Framework初体验(二)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • /etc/fstab 只读无法修改的解决办法
  • /var/lib/dpkg/lock 锁定问题
  • [2]十道算法题【Java实现】
  • [AutoSar]BSW_Com02 PDU详解