博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
topcoder srm 680 div1 -3
阅读量:6412 次
发布时间:2019-06-23

本文共 2352 字,大约阅读时间需要 7 分钟。

1、一个长度为$n$的数组$A,1\leq A_{i} \leq b$。$n$是偶数。$A$中任意两个数字不相等,且$A$中奇数的个数等于偶数的个数。另外有$m$个限制,第$i$个限制是$A$中$[1,x_{i}]$之间的数字的个数为$c_{i}$。问是否存在一个数组 $A$满足上述所有条件?

$n\leq 50,n \leq b \leq 2000,m\leq 50$

思路:将限制按照$x$排序。那么$[x_{i}+1,x_{i+1}]$中数字个数为$c_{i+1}-c_{i}$。然后进行动态规划。$f[i][j]$表示考虑了前$i$个区间的限制,其中偶数的个数为$j$时是否成立。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int mod=1000000007;struct node{ int ll,rr,cnt; node(){} node(int _ll,int _rr,int _cnt):ll(_ll),rr(_rr),cnt(_cnt) {}};int f[55][55];class BearFair{public: string isFair(int n,int b,vector
x,vector
c) { const int m=(int)x.size(); vector
> V; for(int i=0;i
all; for(int i=0;i
V[i].first) return "unfair"; all.push_back(node(1,V[i].first,V[i].second)); } else { if(V[i].second
V[i].first-V[i-1].first) return "unfair"; if(V[i].second!=V[i-1].second&&V[i].first==V[i-1].first) return "unfair"; if(V[i].first!=V[i-1].first) { all.push_back(node(V[i-1].first+1,V[i].first,V[i].second-V[i-1].second)); } } } if(V.back().second>n) return "unfair"; if(V.back().first
>1])return "fair"; return "unfair"; }};

2、计算最小生成树的伪代码如下:

While H is not connected yet:    For each component C in H:        Find the lightest edge in G that has exactly one endpoint in C.        Mark this edge for addition.    Add all marked edges to H.

 其中,$G$是给定的图,$H$是最后要求的最小生成树。现在构造一个$n$个顶点$m$条边的图$G$使得上述$while$循环恰好执行$k$次。

思路:首先$[1,n]$区间每个节点是单独的一个分量,每次将该区间分为两半,最后将这两部分连在一起。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int N=1005;int h[N*N];int n,m;set
> S;vector
ans;void add(int u,int v,int w){ h[w]=1; ans.push_back(u); ans.push_back(v); if(u
>1; int cc=R-L+1; if(cc==3) return 0; if(!dfs(L,M,k-1)) return 0; if(!dfs(M+1,R,k-1)) return 0; add(L,R,++cur); return 1;}class BearSpans{public: vector
findAnyGraph(int nn,int mm,int k) { for(int i=1;i<=nn;++i) { for(int j=i+1;j<=nn;++j) { S.insert(make_pair(i,j)); } } n=nn; m=mm; if(!dfs(1,n,k)) return vector
{-1}; while(cur
p=*S.begin(); S.erase(p); add(p.first,p.second,++cur); } return ans; }};

  

转载地址:http://ipdra.baihongyu.com/

你可能感兴趣的文章
Linux-shell 练习题(一)
查看>>
12.01个人计划
查看>>
Dynamics CRM ISV文件夹禁用后的解决方案
查看>>
ASP.NET中IsPostBack详解
查看>>
Apple开启双重认证过程
查看>>
西安中科创达面试(java方向)
查看>>
es6+node
查看>>
常见的装包的三种宝,包 bao-devel bao-utils bao-agent ,包 开发包 工具包 客户端...
查看>>
Linux最大文件打开数
查看>>
java继承和多态
查看>>
django加载模板文件
查看>>
nohup—后端守护进程
查看>>
jsp,2016.11.28
查看>>
C# 将数字时间转化为特定格式字符串
查看>>
HDU_1285_拓扑排序(优先队列)
查看>>
leetcode_951. Flip Equivalent Binary Trees_二叉树遍历
查看>>
3.3绿盟面试
查看>>
Android jni中数组参数的传递方式
查看>>
logback-spring.xml的schema
查看>>
B. Emotes
查看>>