topcoder srm 692 div1 -23
1、给定一个带权有向图。选出一些边满足使得任意两点可相互到达的前提下使得选出的边的权值的最大最小差值最小。
思路:二分答案,然后枚举权值的范围判断是否可行。
#include <stdio.h>
#include <string>
#include <stack>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std; vector<int> g1[55];
vector<int> g2[55]; class HardProof
{
int n;
int G[55][55];
int a[55*55],aNum; void dfs(int u,int f[],vector<int> g[55])
{
if(f[u]) return;
f[u]=1;
for(int i=0;i<(int)g[u].size();++i)
{
int v=g[u][i];
dfs(v,f,g);
}
} int check(int M)
{
for(int i=1;i<=aNum;++i)
{
const int S=a[i]; for(int i=0;i<n;++i) g1[i].clear(),g2[i].clear(); for(int i=0;i<n;++i) {
for(int j=0;j<n;++j) {
if(i!=j&&S<=G[i][j]&&G[i][j]<=S+M) {
g1[i].push_back(j);
g2[j].push_back(i);
}
}
}
int f1[55],f2[55];
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2)); dfs(0,f1,g1);
dfs(0,f2,g2); for(int i=0;i<n;++i) {
if(!f1[i]||!f2[i]) break;
if(i==n-1) return 1;
}
}
return 0;
} public:
int minimumCost(vector<int> D)
{
n=1;
while(n*n!=(int)D.size()) ++n;
if(1==n) return 0; int low=150000,high=0;
aNum=0;
for(int i=0;i<n;++i) {
for(int j=0;j<n;++j) if(i!=j) {
int p=D[i*n+j];
if(p<low) low=p;
if(p>high) high=p;
G[i][j]=p;
a[++aNum]=p;
}
} sort(a+1,a+aNum+1);
aNum=unique(a+1,a+aNum+1)-(a+1); high=high-low;
low=0;
int ans=high;
while(low<=high)
{
int M=(low+high)>>1;
if(check(M)) ans=min(ans,M),high=M-1;
else low=M+1;
}
return ans;
}
};
topcoder srm 692 div1 -23的更多相关文章
- topcoder srm 715 div1 -23
1.一个计算器,它执行的是一个只包含‘+’,‘-’的字符串$s$.初始化值为0,每遇到一个‘+’增加1,否则减少1.并保存运算过程的最大最小值$Max,Min$,最后的答案是$Max-Min$.比如$ ...
- topcoder srm 710 div1 -23
1.给定两个长度都为$n$的数组$A,B$,给出一个操作序列将$A$变成$B$.每个操作可以是以下两种之一:(1)选择一个$i,0\leq i <n$且$A_{i} \neq 0$,令$t=A_ ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 460 div1
problem1 link 设$f[i][j]$表示已经分配了answers中的前$i$个,分配给的问题的状态为 $j$的方案数. 其中状态可以用$n$位的三进制表示,0表示还未分配,1表示已分配是 ...
- topcoder srm 696 div1 -3
1.给定一个50个节点的无向图,有$m$条边.现在以任意一种序列对每个节点染色.染当前节点的代价为染色完当前节点后满足两个端点都被染色的边的数量.求最小的染色代价.$m \leq 20$ 思路:一个直 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
随机推荐
- 关于Sublime Text3的emmet插件和tab快捷键冲突问题
当使用Sublime text3时会遇到快捷键冲突的问题,其中就有安装Emmet之后,tab无法缩进了, 网上有些说看看Browse Packages目录下是否有PyV8插件安装,该插件一般情况下随E ...
- JavaScript-switch-case运用-案例
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- RabbitMQ理论
RabbitMQ理论 消息 = 有效载荷(数据) + 标签(包含载荷和收件人的信息) 信道:你的应用于RabbitMQ代理服务器之间的TCP连接(有唯一的ID),信道主要解决了每一个线程单独T ...
- SQLSetConnectAttr
SQLSetConnectAttr 函数定义: 用法类似于SQLSetEnvAttr,该函数是设置连接的各项属性用的 SQLRETURN SQLSetConnectAttr( SQLHDBC ...
- django中orm的批量操作
ORM批量操作 数据模型定义 from django.db import models class Product(models.Model): name = models.CharField(max ...
- 怎么查 ODBC Driver for SQL Server
1)进入服务器,找到SQL Server 2016 Configuration... ,点进去就好了 2)
- python内置函数zip
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以 ...
- 20165316 技能学习心得与c语言学习
20165316 技能学习心得与c语言学习 一.技能学习经验 我会打乒乓球,在中国,我只能说我"会"打,至于"比大多数人更好"我不敢断言,因为我无时无刻不感受到 ...
- 【JavaScript 6连载】三、构造函数
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 问题 1084: 用筛法求之N内的素数。
#include <iostream> #include <cstdio> #include <cstring> #include <string> # ...