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-;
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 (思维+模拟)的更多相关文章
- codeforces 887A Div. 64 思维 模拟
A. Div. 64 time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- CodeForces.158A Next Round (水模拟)
CodeForces.158A Next Round (水模拟) 题意分析 校赛水题的英文版,坑点就是要求为正数. 代码总览 #include <iostream> #include &l ...
- 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 ...
- 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 ...
- Codeforces 758D:Ability To Convert(思维+模拟)
http://codeforces.com/problemset/problem/758/D 题意:给出一个进制数n,还有一个数k表示在n进制下的值,求将这个数转为十进制最小可以是多少. 思路:模拟着 ...
- Codeforces 758C:Unfair Poll(思维+模拟)
http://codeforces.com/problemset/problem/758/C 题意:教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点 ...
- CF--思维练习--CodeForces - 216C - Hiring Staff (思维+模拟)
ACM思维题训练集合 A new Berland businessman Vitaly is going to open a household appliances' store. All he's ...
- Educational Codeforces Round 63 (Rated for Div. 2) B. Game with Telephone Numbers 博弈思维+模拟+贪心思维
题意:博弈题面 给出一个数字序列 (>=11) 有两个人任意删除数字 直到 数字只剩下11位 如果删除后的数字串开头是8那么就是第一个赢 否则就是第二个人赢 第一个人先手 数字序列一定是奇 ...
- Codeforces Round #469 (Div. 2)C. Zebras(思维+模拟)
C. Zebras time limit per test memory limit per test 512 megabytes input standard input output standa ...
随机推荐
- Django之Session与Cookie
目录 一.cookie Cookie的由来 什么是Cookie Cookie的原理 查看Cookie cookie与session的作用 二.Django中操作Cookie 获取Cookie 设置Co ...
- python之嵌套函数调用
#定义嵌套函数 def func1(): print('this is func1') def func2(): print('this is func2')#调用1func1()输出:this is ...
- Js字符串按数量分组
代码: function group(ss,step) { var r = []; function doGroup(s) { if (!s) return; r.push(s.substr(0, s ...
- jS Ajax 上传文件报错"Uncaught TypeError: Illegal invocation"
使用jquery ajax异步提交文件的时候报Uncaught TypeError :Illegal invocation错误,报错信息如图: 错误原因: jQuery Ajax 上传文件处理方式,使 ...
- Elasticsearch系列---搜索执行过程及scroll游标查询
概要 本篇主要介绍一下分布式环境中搜索的两阶段执行过程. 两阶段搜索过程 回顾我们之前的CRUD操作,因为只对单个文档进行处理,文档的唯一性很容易确定,并且很容易知道是此文档在哪个node,哪个sha ...
- 递推预处理 + Manacher
链接:https://www.nowcoder.com/acm/contest/131/D来源:牛客网 字符串 S 只包含小写英文字母.有四种操作,每次操作你可以选择其中一种: 删除字符串的第一个字母 ...
- Django设置 DEBUG=False后静态文件无法加载解决
前段时间调试一直是在Debug=True先运行的,没有什么问题.今天关闭了Debug后,出现了一个问题.就是静态文件找不到了,「img.css.js」都提示404,无法准确的访问 static 静态文 ...
- 在winform中使用cefsharp.winform嵌入浏览器(含视频教程)
免费视频教程和源码: https://www.bilibili.com/video/av84573813/ 1. 开始使用CefSharp在Winform中嵌入网页 2. 解决重复打开Cefsharp ...
- es7中数组如何判断元素是否存在
const arr = [1,2,3,4,5,6] console.log(arr.includes(4)) //true
- C语言进阶——全局变量
全局变量 ·定义在函数外面的变量是全局变量 ·全局变量具有全局的生存期和作用域 ·它们与任何函数都无关 ·在任何函数内部都可以使用它们 全局变量初始化 ·没有做初始化的全局变量会得到0值 ·指针会得到 ...