解题报告:Codeforces Round #432 (Div. 1) D. Tournament Construction (DP+构造)
来源:互联网 发布:python 日期格式 编辑:程序博客网 时间:2024/06/06 09:02
题目链接
题意:
给出点的出度的去重集合,要求构造一个最小点数的竞赛图
并存在一个出度序列(d1,d2,d3...dn)满足任意前缀k项和大于k*(k-1)/2
(点数<=30,0<=出度<=30)
思路:
可以确定点数的上界为61 ( n*30>=n*(n-1)/2 )
定义dp[ n ] [ m ] [ l ] :能否用集合的前m项(至少取一个)构造出n个点 l 条边的图
那么很容易得到转移方程:
找出满足要求的最小n,dfs出n个点的出度
最后一步是利用这个n个点构造出一个竞赛图
可以发现一个竞赛图删除一个点以及它的所有边后仍然是一个竞赛图
那么避免冲突每次选择最小出度的点更新边以及其他点的出度即可
代码:
#include<bits/stdc++.h>using namespace std;int n,m;int A[35],ans[65],pos[65];bool G[65][65],dp[65][35][2000];void dfs(int a,int b,int c){ if(!a)return ; ans[a--] = A[b];c-=A[b]; if(dp[a][b][c])return dfs(a,b,c); return dfs(a,b-1,c);}inline void makeG(){ for(int i=1;i<=n;++i)pos[i]=i; for(int i=1;i<=n;++i){ sort(pos+i,pos+n+1,[](int a,int b){return ans[a]<ans[b];}); for(int j=i+1;j<=i+ans[pos[i]];++j)G[pos[i]][pos[j]]=1; for(int j=i+ans[pos[i]]+1;j<=n;++j)G[pos[j]][pos[i]]=1,ans[pos[j]]--; }}int main(){ scanf("%d",&m);n = 1 ; for(int i=1;i<=m;++i)scanf("%d",&A[i]); sort(A+1,A+m+1);dp[1][1][A[1]] = true; while(n<62&&(n<m||!dp[n][m][n*(n-1)/2])){ for(int i=1;i<=m;++i) for(int j=n*(n-1)/2,ed=n*A[m];j<=ed;++j) if(dp[n][i][j])dp[n+1][i][j+A[i]] = dp[n+1][i+1][j+A[i+1]] = true; ++n; } if(n>61){ printf("=(\n"); return 0; } dfs(n,m,n*(n-1)/2); printf("%d\n",n);makeG(); for(int i=1;i<=n;++i,printf("\n"))for(int j=1;j<=n;++j) printf("%d",G[i][j]); return 0;}
阅读全文
0 0
- 解题报告:Codeforces Round #432 (Div. 1) D. Tournament Construction (DP+构造)
- 解题报告:Codeforces Round #433 (Div. 1) D. Michael and Charging Stations (DP)
- Codeforces Round #250 (Div.1) 解题报告
- Codeforces Round #327 (Div. 1) 解题报告
- Codeforces Round #326 (Div. 1) 解题报告
- Codeforces Round #325 (Div. 1) 解题报告
- Codeforces Round #274 (Div. 2) 解题报告 (C D E)
- Codeforces Round #306 (Div. 2) D.E. 解题报告
- Codeforces Round #443 (Div. 1) C. Tournament
- Codeforces Round #353 (Div. 2) D. Tree Construction (构造二叉搜索树)
- 解题报告:Codeforces Round #432 (Div. 2) D. Arpa and a list of numbers 暴力
- 解题报告:Codeforces Round #146 (Div. 1) B. Let's Play Osu! 概率DP
- 解题报告:Codeforces Round #362 (Div. 1) A. Lorenzo Von Matterhorn 树状概率DP
- Codeforces Round #353 (Div. 2) D. Tree Construction
- Codeforces Round #353 (Div. 2)D. Tree Construction
- Codeforces Round #353 (Div. 2) D. Tree Construction (BST)
- Codeforces Round #353 (Div. 2) D. Tree Construction
- Codeforces Round #240 (Div. 1) 前3题 解题报告
- 献给初学者:谈谈如何学习Linux操作系统
- poj 3080
- 图床
- hostname与/etc/hostst ; /etc/sysconfig/network的关系
- POJ3273
- 解题报告:Codeforces Round #432 (Div. 1) D. Tournament Construction (DP+构造)
- 学生管理系统总结(一)
- C-一个通用查找函数
- 数据挖掘领域重要会议与期刊情况
- 新博客地址
- C#构造函数里的base和this的区别
- 路由转发实验
- 9-7考试总结
- 土圭垚㙓数学课(二)视锥体八个顶点的计算方法