题意:

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

网格范围为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-;
const int mod = 1e9+;
const int maxn = 2e6+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); vector<PI>ans;
PI a[];
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=;
else dx=abs(b.fst-x)/(b.fst-x);
if(b.sc==y)dy=;
else dy=abs(b.sc-y)/(b.sc-y); if(dx!=)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 = ; i <= ; i++){
scanf("%d %d", &a[i].fst, &a[i].sc);
ans.pb(a[i]);
} int d1 = d(a[],a[]);
int d2 = d(a[],a[]);
int d3 = d(a[],a[]);
int dd = min(min(d1,d2),d3);
if(dd==d3){
swap(a[],a[]);
}
else if(dd == d2){
swap(a[],a[]);
}
PI pos=make_pair(-,-);
int x1 = min(a[].fst,a[].fst);int x2=max(a[].fst,a[].fst);
int y1 = min(a[].sc,a[].sc);int y2=max(a[].sc,a[].sc);
for(int i = ; i <= ; 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 = ; dx <= ; dx++){
int x = a[].fst+dx;
int y = a[].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[].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 = ; dy <= ; dy++){
int x = a[].fst;
int y = a[].sc+dy;
if(x>=x1&&x<=x2&&y>=y1&&y<=y2){
pos = make_pair(x,y);break;
}
y = a[].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==-){
PI b[];
b[] = make_pair(x1,y1);
b[] = make_pair(x1,y2);
b[] = make_pair(x2,y1);
b[] = make_pair(x2,y2);
int ttmp = inf;
int pp = -;
for(int i = ; i <= ; i++){
if(ttmp>d(a[],b[i])){
ttmp=d(a[],b[i]);
pp=i;
}
}
pos=b[pp];
}
//printf(" %d %d\n",pos.fst,pos.sc);
//printf(" %d\n",ans.size());
link(a[],pos);
link(a[],pos);
link(a[],pos); if(pos!=a[]&&pos!=a[]&&pos!=a[])ans.pb(pos);
printf("%d\n",ans.size());
sort(ans.begin(), ans.end(), cmp);
for(int i = ; i < (int)ans.size(); i++){
printf("%d %d\n",ans[i].fst,ans[i].sc);
}
return ;
} /* */

Codeforces 1087C Connect Three (思维+模拟)的更多相关文章

  1. codeforces 887A Div. 64 思维 模拟

    A. Div. 64 time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  2. CodeForces.158A Next Round (水模拟)

    CodeForces.158A Next Round (水模拟) 题意分析 校赛水题的英文版,坑点就是要求为正数. 代码总览 #include <iostream> #include &l ...

  3. Codeforces Round #706 (Div. 2)B. Max and Mex __ 思维, 模拟

    传送门 https://codeforces.com/contest/1496/problem/B 题目 Example input 5 4 1 0 1 3 4 3 1 0 1 4 3 0 0 1 4 ...

  4. Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】

    传送门:http://codeforces.com/contest/1087/problem/C C. Connect Three time limit per test 1 second memor ...

  5. Codeforces 758D:Ability To Convert(思维+模拟)

    http://codeforces.com/problemset/problem/758/D 题意:给出一个进制数n,还有一个数k表示在n进制下的值,求将这个数转为十进制最小可以是多少. 思路:模拟着 ...

  6. Codeforces 758C:Unfair Poll(思维+模拟)

    http://codeforces.com/problemset/problem/758/C 题意:教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点 ...

  7. CF--思维练习--CodeForces - 216C - Hiring Staff (思维+模拟)

    ACM思维题训练集合 A new Berland businessman Vitaly is going to open a household appliances' store. All he's ...

  8. Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维

    题意:博弈题面  给出一个数字序列 (>=11)  有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手  数字序列一定是奇 ...

  9. Codeforces Round #469 (Div. 2)C. Zebras(思维+模拟)

    C. Zebras time limit per test memory limit per test 512 megabytes input standard input output standa ...

随机推荐

  1. Django之Session与Cookie

    目录 一.cookie Cookie的由来 什么是Cookie Cookie的原理 查看Cookie cookie与session的作用 二.Django中操作Cookie 获取Cookie 设置Co ...

  2. python之嵌套函数调用

    #定义嵌套函数 def func1(): print('this is func1') def func2(): print('this is func2')#调用1func1()输出:this is ...

  3. Js字符串按数量分组

    代码: function group(ss,step) { var r = []; function doGroup(s) { if (!s) return; r.push(s.substr(0, s ...

  4. jS Ajax 上传文件报错"Uncaught TypeError: Illegal invocation"

    使用jquery ajax异步提交文件的时候报Uncaught TypeError :Illegal invocation错误,报错信息如图: 错误原因: jQuery Ajax 上传文件处理方式,使 ...

  5. Elasticsearch系列---搜索执行过程及scroll游标查询

    概要 本篇主要介绍一下分布式环境中搜索的两阶段执行过程. 两阶段搜索过程 回顾我们之前的CRUD操作,因为只对单个文档进行处理,文档的唯一性很容易确定,并且很容易知道是此文档在哪个node,哪个sha ...

  6. 递推预处理 + Manacher

    链接:https://www.nowcoder.com/acm/contest/131/D来源:牛客网 字符串 S 只包含小写英文字母.有四种操作,每次操作你可以选择其中一种: 删除字符串的第一个字母 ...

  7. Django设置 DEBUG=False后静态文件无法加载解决

    前段时间调试一直是在Debug=True先运行的,没有什么问题.今天关闭了Debug后,出现了一个问题.就是静态文件找不到了,「img.css.js」都提示404,无法准确的访问 static 静态文 ...

  8. 在winform中使用cefsharp.winform嵌入浏览器(含视频教程)

    免费视频教程和源码: https://www.bilibili.com/video/av84573813/ 1. 开始使用CefSharp在Winform中嵌入网页 2. 解决重复打开Cefsharp ...

  9. es7中数组如何判断元素是否存在

    const arr = [1,2,3,4,5,6] console.log(arr.includes(4)) //true

  10. C语言进阶——全局变量

    全局变量 ·定义在函数外面的变量是全局变量 ·全局变量具有全局的生存期和作用域 ·它们与任何函数都无关 ·在任何函数内部都可以使用它们 全局变量初始化 ·没有做初始化的全局变量会得到0值 ·指针会得到 ...