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$段,考虑最少能够减少多少划分 ...
随机推荐
- 移动测试===利用adb命令查看apk文件包名的一些方法
前提是已经下载android SDK并配好环境变量! 在控制台输入命令$adb shell pm 可以看到adb shell pm的相关用法,详细信息请自己看输出 要看一个apk文件的相关信息最简单实 ...
- 算法题之找出数组里第K大的数
问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...
- [LabVIEW架构]ActorFramework(二)
前言 在上一个文章中,我们介绍了一下LabVIEW中AF的基本概念,本讲将以上一次的例子来讲解LabVIEW中的实现 正文 范例说明 假定两个人,一个作为老师,一个作为学生.学生每天早上给老师发送一封 ...
- 【msgpack-python】安装
1.安装pip:http://blog.iyestin.com/2014/03/15/python-pip-install/ http://www.linuxde.net/2014/05/15576. ...
- sql server 2008 R2无法连接127.0.0.1报错 Server error:40(错误:53)
在公司用sql server 2008 R2很好的,回家连接127.0.0.1就报错.sql server2008R2主机名和.都可以登录,连接127.0.0.1出错,在与 SQL Server 建立 ...
- 【hdoj_2082】找单词
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2082 此题采用母函数的知识求解,套用母函数模板即可: http://blog.csdn.NET/ten_s ...
- php写入和读取文件内容
function read_file($filename){ // $filename = "/usr/local/something.txt"; $handle = @fopen ...
- shadownsocks SSR 账号密码注册 可1元体验一天
shadownsocks SSR 账号密码注册 可1元体验一天 注册地址 https://www.cup123.club/register?aff=809
- 前端读者 | 前端开发者调试面板vConsole
来着微信团队开源的一个调试工具,[GitHub地址]https://github.com/Tencent/vConsole 一个轻量.可拓展.针对手机网页的前端开发者调试面板. 特性 查看 conso ...
- vue小荔枝,时间控件,动态按月份增减。
依赖框架有jq,bootstrap3.0,vue2.0; 自封装(搬运)时间控件,bootstrap-datetimepicker.资源下载:看这里 需求: 默认本地时间,相隔一个月 四个选项:1一个 ...