Problem Description
哗啦啦村袭击了喵哈哈村!

度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村。

但是度度熊发现,这是一场旷日持久的战斗,所以度度熊决定要以逸待劳,保存尽量多的体力,去迎战哗啦啦村的战士。

于是度度熊决定派尽量多的人去休息,但是同时也不能松懈对喵哈哈村的保护。

换句话而言,度度熊希望尽量多的人休息,而且存在一个包围圈由剩下的人组成,且能够恰好的包围住喵哈哈村的所有住房(包括边界)。

请问最多能让多少个人休息呢?

Input
本题包含若干组测试数据。

第一行一个整数n,表示喵哈哈村的住房数量。

接下来n行,每行两个整数(x1[i],y1[i]),表示喵哈哈村的住房坐标。

第n+1行一个整数m,表示度度熊的士兵数量。

接下来m行,每行两个整数(x2[i],y2[i]),表示度度熊伙伴的坐标。

满足:

1<=n,m<=500

-10000<=x1[i],x2[i],y1[i],y2[i]<=10000

Output
请输出最多的人员休息的数目。

如果无法保护整个村庄的话,输出"ToT"

solution

  • 暴力枚举所有士兵点对,对于每个点对O(n)检测,如果所有房子都在直线的一侧,那么连起来,反之不连。最后floyd求最小环,没有环则输出ToT。
  • 判断是否在一侧时用向量点积的正负来判断。
  • 三点共线时要特判。

codes

开始写了一个不知道为啥TLE了,,然后看大家都是画风一致的结构体,就重写了一个版本。

//AC
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 550, inf = 1<<28;
typedef struct Point{int x, y;Point operator - ( const Point b)const{Point c;c.x = x-b.x, c.y = y-b.y;return c;}double operator * (const Point b)const{return x*b.y-y*b.x;}
}Point;
Point h[maxn], s[maxn];
int n, m, ans, G[maxn][maxn];
bool check(Point x, Point y, Point z){if((x.x<z.x && y.x<z.x) || (x.y<z.y && y.y<z.y) || (x.x>z.x && y.x>z.x) || (x.y>z.y && y.y>z.y))return 1;return 0;
}
int main(){while(scanf("%d", &n)!=EOF){memset(G, 62, sizeof(G));for(int i = 1; i <= n; i++)scanf("%d%d", &h[i].x, &h[i].y);scanf("%d", &m);for(int i = 1; i <= m; i++)scanf("%d%d", &s[i].x, &s[i].y);for(int i = 1; i <= m; i++){for(int j = 1; j <= m; j++){int ok = 1;for(int k = 1; k <= n; k++){if((s[i]-s[j])*(s[i]-h[k])<0 || (s[i]-s[j])*(s[i]-h[k])==0 && check(s[i], s[j], h[k])){ok = 0; break;}}if(ok){G[i][j] = 1;}}}ans = inf;for(int k = 1; k <= m; k++){for(int i = 1; i <= m; i++){if(G[i][k]==inf)continue;for(int j = 1; j <= m; j++)G[i][j] = min(G[i][j], G[i][k]+G[k][j]);}}for(int i = 1; i <= m; i++)ans = min(ans, G[i][i]);if(ans > m)printf("ToT\n");else printf("%d\n", m-ans);}return 0;
}
//TLE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 550,inf = 1e9;
int n, m;
int hx[maxn], hy[maxn];
int dx[maxn], dy[maxn];
int G[maxn][maxn];
int main(){ios::sync_with_stdio(false);while(cin>>n){memset(G, 62, sizeof(G));for(int i = 1; i <= n; i++)cin>>hx[i]>>hy[i];cin>>m;for(int i = 1; i <= m; i++)cin>>dx[i]>>dy[i];for(int i = 1; i <= m; i++){for(int j = 1; j <= m; j++){int ok = 1;for(int k = 1; k <= n; k++){int s1x = dx[i]-dx[j], s1y = dy[i]-dy[j];int s2x = dx[i]-hx[k], s2y = dy[i]-hy[k];int mx = s1x*s2x+s1y*s2y;int link = 0;if((dx[i]<hx[k]&&dx[j]<hx[k])||(dy[i]<hy[k]&&dy[j]<hy[k])||(dx[i]>hx[k]&&dx[j]>hx[k])||(dy[i]>hy[k]&&dy[j]>hy[k])){link = 1;}if(mx<0 || mx==0&&link){ok = 0;break;}}if(ok){G[i][j] = 1;}}}int ans = inf;for(int k = 1; k <= m; k++){for(int i = 1; i <= m; i++){if(G[i][k]==inf)continue;for(int j = 1; j <= m; j++)G[i][j] = min(G[i][j],G[i][k]+G[k][j]);}}for(int i = 1; i <= m; i++)ans = min(ans,G[i][i]);if(ans > m) cout<<"ToT\n";else cout<<m-ans-1<<'\n';}return 0;
}

2020 年百度之星·程序设计大赛 - 测试赛1001 度度熊保护村庄相关推荐

  1. 2017百度之星程序设计大赛 - 资格赛:1003 度度熊与邪恶大魔王

    题目: Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来. 邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力. 度度熊一共拥有m种 ...

  2. 2020 年百度之星·程序设计大赛部分题解

    目录 Dec Covid Car Intersection Dec 2020 年百度之星·程序设计大赛 - 初赛一 HUD 6745  题解: 线性DP:f(i,j) 表示从i开始减,从j开始减时互质 ...

  3. 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  4. 2020年百度之星·程序设计大赛-初赛一

    Pro.ID 1001 Drink 题解 1002 GPA 题解 1003 Dec 题解 1004 Civilization 1005 Rotate 题解 1006 Matrix 1007 Mosqu ...

  5. 2020 年百度之星·程序设计大赛 · 官方题解汇总

    1.测试赛 2.初赛一 留个备份,方便以后找 3.初赛二 4.初赛三 5.复赛

  6. 2020年百度之星·程序设计大赛 - 初赛一(前三题)

    文章目录 Drink[贪心] 题目描述 测试样例 解题思路 赛时AC代码 赛后优化AC代码 总结: GPA[枚举] 题目描述 测试样例 解题思路 赛时WA代码 赛时AC代码 总结: Dec[反向dp+ ...

  7. 2020 年百度之星·程序设计大赛 - 复赛 1002 Binary Addition

    problem Binary Addition Accepts: 851 Submissions: 3320 Time Limit: 2000/1000 MS (Java/Others) Memory ...

  8. 2020 年百度之星·程序设计大赛 - 复赛 1001Battle for Wosneth

    problem Battle for Wosneth Accepts: 1174 Submissions: 5432 Time Limit: 2000/1000 MS (Java/Others) Me ...

  9. 2020 年百度之星·程序设计大赛 - 初赛一 Civilization BFS广搜

    problem Civilization Accepts: 619 Submissions: 2182 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

最新文章

  1. Ubuntu 10.10 安装 libx11-dev
  2. 陶哲轩自述考砸经历:智商高达230的数学天才,却因没复习险些挂科
  3. php报错:找不到php_pdo_oci.dll模块
  4. Windows 7的VPC虚拟机自动不与主机时间同步的解决办法
  5. 跨平台传输中使用base64来保证非ascii码字符串的完整性
  6. ML之回归预测:利用九大类机器学习算法对无人驾驶汽车系统参数(2018年的data,18+2)进行回归预测值VS真实值
  7. Python基础知识点总结
  8. interrupt()会中断线程的wait等待
  9. 09_ServletContext介绍
  10. 通过系统进程查找sql语句
  11. Asp.Net中Cache操作类
  12. HDU 4738 无向图求桥
  13. 重点项目却总是腐化,程序员为什么会写烂代码?
  14. Mariadb 安装教程 Windows版
  15. [.Net码农]RDLC报表中使用自定义函数
  16. 跳跳棋【LCA】【二分】
  17. docker 部署 gitlab gitlab-runner 实现 CI
  18. 特斯拉降价也无法阻挡国内新能源汽车厂商前进的步伐
  19. 最新钣金设备制造公司网站模板源码+手机端+后台
  20. jvm初学-什么是Native方法

热门文章

  1. TensorFlow 学习(四)—— computation graph
  2. python def函数参数_Python def函数的定义、使用及参数传递实现代码
  3. python和java学哪个好-Python VS Java,学哪个更有前途?
  4. python下载哪个版本好-Python下载哪个版本比较好?
  5. python入门指南 许半仙-《猛一相亲指南》TXT全本 百度云网盘下载 by许半仙
  6. python从入门到精通需要多久-python学习从入门到精通要多久
  7. 国内有哪些做H5走心的外包服务团队或公司?
  8. class属性表种类集合,以及字段详解
  9. 输入指定答案提示正确C语言,大学C语言课件及复习答案输入输出.ppt
  10. win102004优化_windows 10新版2004和1909该如何选择