6445: 棋盘V

时间限制: 1 Sec  内存限制: 128 MB
提交: 325  解决: 31
[提交] [状态] [讨论版] [命题人:admin]

题目描述

有一块棋盘,棋盘的边长为100000,行和列的编号为1到100000。棋盘上有n个特殊格子,任意两个格子的位置都不相同。
现在小K要猜哪些格子是特殊格子。她知道所有格子的横坐标和纵坐标,但并不知道对应关系。换言之,她只有两个数组,一个存下了所有格子的横坐标,另一个存下了所有格子的纵坐标,而且两个数组都打乱了顺序。当然,小K猜的n个格子的位置也必须都不相同。
请求出一个最大的k,使得无论小K怎么猜,都能猜对至少k个格子的位置。

输入

输入数据第一行包含一个整数n。
接下来n行,每行描述一个特殊格子的位置。第i行含有两个整数xi和yi ,代表第i个格子的坐标。保证任意两个格子的坐标都不相同。

输出

输出一行,包含一个整数,代表最大的k。

样例输入

2
1 1
2 2

样例输出

0

提示

小K有可能会猜(1,2),(2,1),此时一个都没对
对于30%的数据,n≤8。
另外有5%的数据,所有横坐标和纵坐标均不相同。
另外有15%的数据,所有横坐标或者纵坐标均不相同。
对于100%的数据,n≤50,1≤xi,yi≤100000。

来源/分类

中山纪念中学20170301

【题意】

对于题意,应该理解为,小K尽量猜错。

对于给出的坐标x和y,完成一个一一匹配,使得匹配完成后,与原坐标重复的最少。

【吐槽】

真的好想吐槽一下这道题。。。。其实应该是吐槽我自己。。。 这道题不算难 也挺好理解  跑一个费用流就OK了 可是我整整Debug了两天。。。没错 就是Debug了两天 感觉写的都对 试了好多个例子也都能过去 就是各种WA各种超时  还是因为我太菜  写代码经常忘掉一些细节。。。 比如终点的设置太小了 我却没发现 然后就一直死在这 。。

下面来谈谈这道题  题目中问的是至少猜对 其实就是让小K尽量去猜错

首先我们对输入的坐标离散化一下,这样方便建图。在正确的x,y之间建边容量=1,费用=1,不正确的x,y之间建边,容量=1,费用=0。然后设置一个虚拟的源点0,虚拟的终点(一个比较大的数,我就是因为设置小了 一直WA 自己一开始还没发现)

对0到所有的x坐标建边,容量为x行所含做标数,费用=0

对所有y到maxver建边,容量为y列所含做标数,费用=0;

对此图跑一遍费用流,按照费用流策略,优先走费用为0的边,即错误边,错误边满流时,不得不走正确边,花费1.

故最后的费用流即为不得不猜对的坐标。

【代码】

#include<bits/stdc++.h>
typedef long long ll;
//#define MAXN 200+10
//#define MAXM 1e5+3;
#define INF 0x3f3f3f3f
const int maxn=1e5+3;
const int MAX=4e2+3;
using namespace std;
int a[107],b[107],num[107];
int vist[107][107];
int ending=105;struct node
{int x;int counts;
}numh[107],numl[107];int cmp(node n,node m){return n.counts>m.counts;}struct nodee{int s,t,len,cap,flow,next;
}e[MAX*MAX];//len路长,cap最大流量,flow已流的量
int head[MAX],cnt;
void add(int u,int v,int len,int cap,int flow=0)
{e[cnt]=nodee{u,v,len,cap,flow,head[u]};head[u]=cnt++;
}int dist[103];
bool vis[103];
int N, M,n;//点数 边数
int source, sink;//超级源点 超级汇点int dis[maxn];//最短路
bool inq[MAX];
int f[MAX];//流量
int pre[maxn];//前驱边void init()
{cnt = 0;memset(head, -1, sizeof(head));
}bool spfa(int s,int t,int &flow,int &cost,int ver) //ver是最大点编号
{for(int i=0;i<=ver;i++)dis[i]=INF;memset(inq,0,sizeof(inq));dis[s]=0;f[s]=INF;queue<int>q;q.push(s);while(!q.empty()){int u=q.front();q.pop();inq[u]=0;for(int i=head[u];~i;i=e[i].next){if(e[i].cap-e[i].flow>0&&dis[e[i].t]>dis[u]+e[i].len)   //只要有流量,并且路径变短{f[e[i].t]=min(f[u],e[i].cap-e[i].flow);dis[e[i].t]=dis[u]+e[i].len;pre[e[i].t]=i;if(!inq[e[i].t])q.push(e[i].t),inq[e[i].t]=1;}}}if(dis[t]==INF) return 0;  //没走到终点flow+=f[t];  //本条增广路的流量cost+=dis[t]*f[t];  //花费for(int u=t;u!=s;u=e[pre[u]].s){e[pre[u]].flow+=f[t];e[pre[u]^1].flow-=f[t];}return 1;
}
int mincost(int s,int t,int ver)
{int flow=0,cost=0;while(spfa(s,t,flow,cost,ver));return cost;
}void getMap()
{scanf("%d",&M);for(int i=0;i<M;i++){scanf("%d%d",&num[i],&num[M+i]);b[i]=num[i],b[M+i]=num[M+i];}sort(num,num+2*M);n = distance(num, unique(num, num + 2*M));//去重之后的总个数for(int i = 0; i < 2*M; ++i){a[i] = lower_bound(num, num + n, b[i]) - num + 1; // lower_bound返回迭代器,并计算位置}for(int i=0;i<M;i++)vist[a[i]][a[i+M]]=1;for(int i=0;i<M;i++){add(a[i],a[i+M]+n+1,1,1);add(a[i+M]+n+1,a[i],-1,0);for(int j=M;j<2*M;j++)if(vist[a[i]][a[j]]==0){vist[a[i]][a[j]]=1;add(a[i],a[j]+n+1,0,1);add(a[j]+n+1,a[i],0,0);}}for(int i=0;i<M;i++){numh[a[i]].x=a[i];numh[a[i]].counts++;numl[a[i+M]].x=a[i+M];numl[a[i+M]].counts++;}sort(numh,numh+n+1,cmp);sort(numl,numl+n+1,cmp);int i=0;while(numh[i].counts!=0){add(0,numh[i].x,0,numh[i].counts);add(numh[i].x,0,0,0);i++;}i=0;while(numl[i].counts!=0){add(numl[i].x+n+1,205,0,numl[i].counts);add(205,numl[i].x+n+1,0,0);i++;}
}int main()
{init();getMap();//建图int ans=mincost(0,205,205);printf("%d\n", ans);//最小费用 最大流return 0;
}

UPC 6445 棋盘相关推荐

  1. upc 6445: 棋盘V (网络流费用流解决匹配问题)

    6445: 棋盘V 时间限制: 1 Sec  内存限制: 128 MB 提交: 325  解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100 ...

  2. LeetCode简单题之判断国际象棋棋盘中一个格子的颜色

    题目 给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标.下图是国际象棋棋盘示意图. 如果所给格子的颜色是白色,请你返回 true,如果是黑色,请返回 false ...

  3. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  4. 【BZOJ-30391057】玉蟾宫棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 753  Solved: 444 [Submit][Status][Discuss] ...

  5. python棋盘放米循环结构_Python递归法计算棋盘上所有路径总奖品最大值(京东2016编程题)...

    问题描述:假设有一个6x6的棋盘,每个格子里有一个奖品(每个奖品的价值在100到1000之间),现在要求从左上角开始到右下角结束,每次只能往右或往下走一个格子,所经过的格子里的奖品归自己所有.问最多能 ...

  6. 【Codeforces】1080C Masha and two friends (棋盘染色)

    http://codeforces.com/problemset/problem/1080/C 给定一个棋盘,(1,1)的位置是白色,观察可以知道,如果横纵坐标之和是偶数,那么是白色,奇数的话就是黑色 ...

  7. A - 棋盘问题 POJ - 1321(dfs)

    A - 棋盘问题 POJ - 1321 dfs 复杂度计算: dfs共进行a步,每步需要循环n次,复杂度为 a^n次方 首先是暴力 an*n,果然炸了 #include<cstdio> # ...

  8. 编程中的一个易错点:判断某个点是否超出棋盘边界

    给定一个r行c列的棋盘,给定一个点x,y,要求判断点(x,y)处是否可以放置棋子. 判断越界时不能转化成一维判断越界,判断越界必须在二维空间中进行. r, c = 3, 3 a = [0] * (r ...

  9. 作弊阴影罩棋盘,人工智能咋避嫌?

    来源:奇怪的科学家 为什么要写这样一句话,就是为了避免剧情和现实生活中发生的事情万一差不多,会侵犯到别人的隐私,发生侵权,给双方带来不必要的麻烦. 这位名为刘超的棋手把手机插在上衣兜里,摄像头正对棋盘 ...

最新文章

  1. R语言plotly包可视化线图(line plot)、使用restyle参数自定义设置可视化结果中线条的颜色、使用按钮动态切换线条的颜色(change line color with button)
  2. 院士:国内科研目前内卷太严重,勿简单“抬轿子”
  3. column 对齐排列命令
  4. Factories Gym - 102222G(2018宁夏邀请赛暨2019银川icpc网络预选赛)
  5. 粥做得好不好,全凭一个良心!
  6. 一文看懂边缘云在广电行业的应用
  7. 【opencv】【图像梯度】
  8. 语音学习笔记(四)【传统声学模型】
  9. 解决文件上传_使用FastDfs上传头像上传不成功的问题---SpringCloud Alibaba_若依微服务框架改造---工作笔记002
  10. pytorch学习笔记(五):线性回归的简洁实现
  11. Nginx 配置 SSL 证书 + 搭建 HTTPS 网站
  12. python turtle绕原点旋转_「加德老师与小朋友们的编程之旅」Python海龟作图(上)
  13. Tesseract调用日文识别模型
  14. latex 长表格中放入多行公式
  15. javaGUI学习1:GUI框架,工具介绍
  16. 机器学习-决策树之分类树python实战(以红酒数据集为例)(二)
  17. C++特征码查找 附加案例
  18. linux把ftp挂载成盘符,使用curlftpfs将ftp空间挂载到本地
  19. 安装mysql staring server 失败 已经成功决解。
  20. 【DeepLearning】吴恩达深度学习课程笔记思维导图

热门文章

  1. mysql查询所有的Java工程师信息_JAVA开发工程师 | 广州三地信息技术有限公司
  2. 研报精选230316
  3. java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统
  4. 一开机就提示脱机工作_每次打开我的电脑总是提示脱机工作、这怎么取消啊
  5. NSGA_II学习案例1
  6. WeChat_微信小程序跳一跳辅助
  7. 2019三星比2018好在哪_2018年:三星S9再见了!2019年:三星S10我来了!
  8. 在圣诞及元旦的日子里如何用html代码画一个爱心树
  9. 白嫖我的世界java
  10. HBase 知识手册