Codeforces 1082D (贪心)
题面
分析
贪心
将度限制大于1的点连成一条链,然后将度限制等于1的点挂上去
形状如下图,其中(1,2,3)为度数限制>1的点
显然直径长度=(度数限制>1的节点个数)-1+min(度数限制等于1的节点个数,2)
那么具体如何构造?
首先将度为1和度>1的节点分开
如果有至少1个度为1的节点,就把它作为直径的起点,如图中的4
然后再将度>1的节点全部接上去
再从另一头倒着挂(图中3开始向2,1)剩下的度为1的节点
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 10005
using namespace std;
int n;
int a[maxn];
struct edge{
int from;
int to;
edge(){
}
edge(int u,int v){
from=u;
to=v;
}
void print(){
printf("%d %d\n",from,to);
}
};
vector<edge>ans;
vector<int>l;
int main(){
int leaf=0;
scanf("%d",&n);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
if(a[i]==1) leaf++;
if(a[i]==0){
printf("NO\n");
return 0;
}
}
if(sum<n*2-2){
printf("NO\n");
return 0;
}
for(int i=1;i<=n;i++){
if(a[i]==1){
l.push_back(i);
a[i]=0;
}
}
int begin=-1;
if(l.size()){
begin=l[l.size()-1];
l.pop_back();
}
for(int i=1;i<=n;i++){
if(a[i]>1){
if(begin!=-1){
a[begin]--;
a[i]--;
ans.push_back(edge(begin,i));
}
begin=i;
}
}
int t=0;
for(int i=n;i>=1;i--){
while(l.size()&&a[i]>0){
a[i]--;
ans.push_back(edge(i,l[t++]));
if(t>=l.size()) break;
}
if(t>=l.size()) break;
}
int d=(n-leaf)-1+min(2,leaf);
if(ans.size()==n-1){
printf("YES %d\n%d\n",d,n-1);
for(int i=0;i<n-1;i++){
ans[i].print();
}
}else{
printf("NO\n");
}
}
Codeforces 1082D (贪心)的更多相关文章
- Codeforces 1082D Maximum Diameter Graph (贪心构造)
<题目链接> 题目大意:给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边. 解题分析:一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽 ...
- CodeForces - 893D 贪心
http://codeforces.com/problemset/problem/893/D 题意 Recenlty Luba有一张信用卡可用,一开始金额为0,每天早上可以去充任意数量的钱.到了晚上, ...
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划
There are n people and k keys on a straight line. Every person wants to get to the office which is l ...
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 828D) - 贪心
Arkady needs your help again! This time he decided to build his own high-speed Internet exchange poi ...
- CodeForces - 93B(贪心+vector<pair<int,double> >+double 的精度操作
题目链接:http://codeforces.com/problemset/problem/93/B B. End of Exams time limit per test 1 second memo ...
- C - Ordering Pizza CodeForces - 867C 贪心 经典
C - Ordering Pizza CodeForces - 867C C - Ordering Pizza 这个是最难的,一个贪心,很经典,但是我不会,早训结束看了题解才知道怎么贪心的. 这个是先 ...
- Codeforces 570C 贪心
题目:http://codeforces.com/contest/570/problem/C 题意:给你一个字符串,由‘.’和小写字母组成.把两个相邻的‘.’替换成一个‘.’,算一次变换.现在给你一些 ...
- Codeforces 732e [贪心][stl乱搞]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变 ...
- Codeforces 721D [贪心]
/* 不要低头,不要放弃,不要气馁,不要慌张. 题意: 给一列数a,可以进行k次操作,每次操作可以选取任意一个数加x或者减x,x是固定的数.求如何才能使得这个数列所有数乘积最小. 思路: 贪心...讨 ...
随机推荐
- 学Python的第八天
最近因为很多生活琐事+生病+培训耽误了好几天的学习,不过幸好身体feel fly!! 今天依旧是爱Python的一天-.- 前几天以及今天所列出来的Python魔法类型不需要死记硬背熬.... #!/ ...
- vue的请求数据方式
一,vue-resource请求数据 介绍:vue-resource请求数据方式是官方提供的一个插件 步骤: 1,npm安装 npm install vue-resource --save ...
- less:运算
less中的运算 -任何数字.颜色或者变量都可以参加运算,运算应该被包裹在括号中. -例如:+-*. @width: 30px; .box { width: (20 + 5) * @width; } ...
- bzoj4811 [Ynoi2017]由乃的OJ 树链剖分+贪心+二进制
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4811 题解 我现在为什么都写一题,调一天啊,马上真的退役不花一分钱了. 考虑这道题的弱化版 N ...
- vsto c# 获取word里面的图片并保存
internal void GetEmbeddedImages() { ; Document doc = Globals.ThisAddIn.Application.ActiveDocument; f ...
- 027:for标签使用详解
for标签使用详解: for...in... 标签: for...in... 类似于 Python 中的 for...in... .可以遍历列表.元组.字符串.字典等一切可以遍历的对象.示例代码如下: ...
- Jenkins镜像
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- linux find rm ls 逻辑非运用
需求场景描述 查找出除已知文件外的文件 办法: [root@VM_58_118_centos test]# .1_fv1..0_pv1..6_15752678845473..2_fv1..4_pv1. ...
- 学习日记2、easyui treeGrid属性及时间
属性 该属性扩展自数据网格(datagrid),下面是为树形网格(treegrid)添加的属性. 名称 类型 描述 默认值 idField string 定义标识树节点的键名字段.必需. null t ...
- Facebook发布Tweaks:让微调iOS应用变得更简单
假设,你正在开发一款iOS应用. 你的iOS应用有很多动画效果,而你(或你的设计师)希望让那些动画效果的持续时间恰到好处.那华丽的抽屉特效是应该耗时半秒钟,还是四分之三秒呢? 通常情况下,开发者会对合 ...