百毒之星资格赛A题

来源:互联网 发布:埃尔文约翰逊生涯数据 编辑:程序博客网 时间:2024/04/30 13:39

很巧妙的建图题

度度熊保护村庄
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”
Sample Input
2
1 1
2 2
4
0 0
0 4
4 2
4 0
1
1 1
2
0 0
0 1

Sample Output
1
ToT


  • 对于每个有序点对(i,j),若所有房子都在点对的右侧,则在图上记dist(i,j)为1,否则为无穷。
  • 在处理完所有有序点(i,j)之后就可以得到一个有向图,找到图上的最小环就是m-答案。
#include <bits/stdc++.h>#define clr(x,y) memset(x,y,sizeof x)#define inf 0x3f3f3f3fusing namespace std;struct Point { int x,y; }point[550],h[550];struct Vec { int x,y; Vec(int _x,int _y):x(_x),y(_y){} };int Cross(Vec a,Vec b)  { return a.x*b.y - b.x*a.y; }int n,m,mp[550][550];bool jgmid(Point a,Point b,Point c) { if (c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x)&&c.y>= min(a.y,b.y)&&c.y<=max(a.y,b.y)) return true; else return false; }int main(){    int n;    while (scanf("%d",&n)!=EOF)    {        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",&point[i].x,&point[i].y);        clr(mp,inf);        for (int i=1;i<=m;i++)            for (int j=1;j<=m;j++)            {                bool flag=true;                int tmp;                 Vec l(point[i].x-point[j].x,point[i].y-point[j].y);                for (int k=1;k<=n;k++)                if ((tmp=Cross(l,Vec(point[i].x-h[k].x,point[i].y-h[k].y))) <0 || (tmp==0 && !jgmid(point[i],point[j],h[k])))                { flag=false;if(!flag)break;}                if (flag) mp[i][j]=1;            }        for (int k=1;k<=m;k++) for (int i=1;i<=m;i++) if (mp[i][k]!=inf) for (int j=1;j<=m;j++) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);        int res=inf; for (int i=1;i<=m;i++) res=min(res,mp[i][i]);        if (res>=inf)  printf("ToT\n"); else printf("%d\n",m-res);    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 档案在自己手里10年了怎么办 快递地址区域划分写错了怎么办 怀孕八个月肛门长个肉疙瘩怎么办呢 客户签了合同不要货了怎么办 不喂母乳宝宝只认识保姆了怎么办? 开创者比赛后没有买的鸽子怎么办 买回来小鸽子开家我敢了怎么办 小鸽子出壳后母鸽就不孵了怎么办 狗狗在笼子里一直叫怎么办 养了一年母鸽子不配对怎么办 血管翳云翳斑翳长满眼睛怎么办 鸽子训放50公里突然下雨了怎么办 安卓手机反应慢又卡怎么办 tcl安卓系统电视反应慢怎么办 狼人杀警长竞选一直平票怎么办 去驾校投诉教练被教练报复怎么办 哈尔滨机场大巴六点的飞机怎么办 山东德州恩城镇的农民怎么办养老险 我的世界联机平台房间进不去怎么办 验车时间过了3天怎么办 在携程订的机票和酒店不能退怎么办 千牛工作台中旺旺登录失败怎么办 掌通家园换手机号了忘了更改怎么办 qq注销了后绑定的全民k歌怎么办 小米账号绑定的手机号注销了怎么办 微信账号注销后绑定的手机号怎么办 微信账号不想用了注销不了怎么办 苹果手机掉了捡到不还怎么办 在工作中把和别人结下梁子了怎么办 在阿里巴巴上买的货物没发货怎么办 做了下颌角一边脸反复肿怎么办 玩广东11选5输50万怎么办 玩广东11选5输了十几万怎么办 新办公楼装修好就要搬进去怎么办 oppo手机上的黄页删了怎么办 小米不小心把手机联系人删了怎么办 58同城小区名输不了怎么办 e路发注册直接有积分怎么办 大众速腾的不锈钢圈被碰花了怎么办 公司卡着生育险不给怎么办 济南图书馆借书超过期限了怎么办