Codeforces Gym 100269K Kids in a Friendly Class 构造题
Kids in a Friendly Class
题目连接:
http://codeforces.com/gym/100269/attachments
Description
Kevin resembles his class in primary school. There were girls and boys in his class. Some of them were
friends, some were not. But if one person considered another person a friend, the opposite was also true.
Interestingly, every girl had exactly a friends among girls and exactly b friends among boys, whereas
every boy had exactly c friends among girls and exactly d friends among boys.
Kevin does not remember the size of his class. Help him reconstruct the class with minimal possible
number of kids, such that the above conditions are satisfied.
Input
The only line contains four integers a, b, c, and d (1 ≤ a, b, c, d ≤ 50)
Output
Output an example of a class of minimal possible size satisfying the above conditions.
The first line should contains two positive integers: m — the number of girls, and n — the number of
boys.
Let’s assign numbers 1 through m to the girls and m + 1 through m + n to the boys.
Each of the next lines should contain a pair of distinct integers describing a pair of friends by their
numbers. Each pair of friends should appear exactly once in this list.
Sample Input
1 2 1 2
Sample Output
2 4
1 2
1 3
1 5
2 4
2 6
3 4
3 5
4 6
5 6
Hint
题意
每个女生认识a个女生,b个男生
每个男生认识c个女生,d个男生
问你怎么构图,才能使得男生+女生最少
题解:
首先我们假设知道了男生和女生的数量的话
建边就很简单,贪心去建边就好了,每次连接度数最小的点
至于怎么知道男生和女生的数量呢?
首先男生和女生的数量肯定是lcm(b,c)的倍数
然后不断check就好了
check主要只判断同性之间就好了
每条边必须连接两个点之内的check一下就好了
有个定理叫做Havel-Hakimi定理
代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int a,b,c,d;
bool check(int n,int m)
{
if(b>m)return false;
if(c>n)return false;
if(a>=n)return false;
if(d>=m)return false;
if(n%a!=0)return false;
if(m%b!=0)return false;
return true;
}
void getedge(int n,int m)
{
priority_queue<pair<int,int> >Q;
for(int i=1;i<=n;i++)
Q.push(make_pair(a,i));
while(!Q.empty())
{
pair<int,int> now = Q.top();
Q.pop();
for(int i=0;i<now.first;i++)
{
pair<int,int> next = Q.top();
Q.pop();
printf("%d %d\n",now.second,next.second);
next.first--;
Q.push(next);
}
}
for(int i=n+1;i<=n+m;i++)
Q.push(make_pair(d,i));
while(!Q.empty())
{
pair<int,int> now = Q.top();
Q.pop();
for(int i=0;i<now.first;i++)
{
pair<int,int> next = Q.top();
Q.pop();
printf("%d %d\n",now.second,next.second);
next.first--;
Q.push(next);
}
}
priority_queue<pair<int,int> >Q1;
priority_queue<pair<int,int> >Q2;
for(int i=1;i<=n;i++)
Q1.push(make_pair(b,i));
for(int i=n+1;i<=m+n;i++)
Q2.push(make_pair(c,i));
while(!Q1.empty())
{
pair<int,int> now = Q1.top();
Q1.pop();
for(int i=0;i<now.first;i++)
{
pair<int,int> next = Q2.top();
Q2.pop();
printf("%d %d\n",now.second,next.second);
next.first--;
if(next.first!=0)Q2.push(next);
}
}
}
int main()
{
freopen("kids.in","r",stdin);
freopen("kids.out","w",stdout);
scanf("%d%d%d%d",&a,&b,&c,&d);
int t=gcd(b,c);
int x=b/t,y=c/t;
int n,m;
for(n=b,m=c;n<=d||m<=a||(m&1)&&(a&1)||(n&1)&&(d&1);n+=x,m+=y);
swap(n,m);
cout<<n<<" "<<m<<endl;
getedge(n,m);
}
Codeforces Gym 100269K Kids in a Friendly Class 构造题的更多相关文章
- Codeforces Gym 102392F Game on a Tree (SEERC2019 F题) 题解
题目链接:https://codeforces.com/gym/102392/problem/F 题意:被这题题意坑了很久,大意是说有一棵根为 \(1\) 的树,每个节点初始都是白色, \(Alice ...
- Codeforces Gym 100610 Problem A. Alien Communication Masterclass 构造
Problem A. Alien Communication Masterclass Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codefo ...
- Codeforces Gym 100650C The Game of Efil 模拟+阅读题
原题链接:http://codeforces.com/gym/100650/attachments/download/3269/20052006-acmicpc-east-central-north- ...
- Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)
题目链接 2016 ACM-ICPC EC-Final Problem G 题意 给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...
- codeforces 1438D,思路非常非常巧妙的构造题
大家好,欢迎来到codeforces专题. 今天选择的问题是contest1438的D题,全场通过人数为1325人.一般在codeforces当中千人通过的题难度都不算太高,但是这题有点例外,虽然没有 ...
- Codeforces Gym 100269A Arrangement of Contest 水题
Problem A. Arrangement of Contest 题目连接: http://codeforces.com/gym/100269/attachments Description Lit ...
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
- Codeforces Gym 101623A - 动态规划
题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...
随机推荐
- Laravel 项目上线的一些注意事项
1.应用生产环境 在 .env 文件里设置 APP_ENV=production 2.关闭调试模式 在 .env 文件中设置 APP_DEBUG = false 3.生成 APP_KEY 使用 Art ...
- python基础===两个list之间移动元素
首先我们先了解一下list的几个常用函数: a = [123,456,"tony","jack"] #list中增加元素a.append("www&q ...
- nginx学习时使用EditPuls编辑conf.xml
一.Nginx简介:是一个使用c语言开发的高性能的http服务器及反向代理服务器 二.由于在linux环境中使用vim修改配置文件相对困难.为此,我们可以借助EditPlus将虚拟机上面的目录引用到E ...
- puppet安装和配置
一.安装puppet准备 //安装准备 ,两台机器都要操作 . 两台机器 172.7.15.106 (server) 172.7.15.111 (client) . 关闭防火墙 setenforce ...
- udp调用connect有什么作用(转)
原文链接如下: http://blog.csdn.net/wannew/article/details/18218619 整理一下.1:UDP中可以使用connect系统调用 2:UDP中connec ...
- vsftpd 虚拟用户配置
vsftpd 虚拟用户的作用是 通过不同的虚拟用户可以有不同的根目录. 从 2.3.5 版本之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能在具有写权限了,如果检查 ...
- 在Mysql中插入百万级别数据的方法
首先,建立部门表和员工表: 部门表: create table dept( id int unsigned primary key auto_increment, deptno mediumint u ...
- linux命令(18):chmod命令
1. 命令格式: chmod [-cfvR] [--help] [--version] mode file 2. 命令功能: 用于改变文件或目录的访问权限,用它控制文件或目录的访问权限. 3. 命令参 ...
- LockSupport学习
LockSupport工具类定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能.Java锁和同步器框架的核心工具类AQS:AbstractQueueSynchronizer,就是通过调 ...
- ES6新数据结构Set让数组去重
function unique(array){ return Array.from(new Set(array)); } var arr = ['aa','bb','cc','',1,0,'1',1, ...