谈论最激烈的莫过于D题了!

看过的两种做法不得不ORZ,特别第二种,简直神一样!!!!!

1th:构造最小生成树。

我们提取所有的边出来按边排序,因为每次我们知道边的权值>0,

之后每次把边加入集合中,不断构造,类似  kruskal算法,构造出边后

再对每个点进行整张图的DFS求距离

复杂度O(N^2lgN):对所有边排序的复杂度。

 #include<bits/stdc++.h>

 #define N 2222
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f
int n;
int f[N],vis[N];
int a[N][N]; struct node
{
int u,v,w;
node(int uu,int vv,int ww):u(uu),v(vv),w(ww){}
}; vector<pair<int,int> > G[N];
vector<node> edge; int find(int x)
{if (f[x]!=x) return f[x]=find(f[x]);} int cmp(node a,node b){return a.w<b.w;} ll dis[N];
void dfs(int x)
{
vis[x]=;
// cout<<dis[x]<<" ";
for (int i=;i<G[x].size();i++)
{
int v=G[x][i].first;
int w=G[x][i].second;
if (vis[v]) continue;
dis[v]=dis[x]+w;
dfs(v);
}
} int solve()
{
for (int i=;i<n;i++)
for (int j=i+;j<=n;j++)
edge.push_back(node(i,j,a[i][j])); for (int i=;i<=n;i++) f[i]=i; sort(edge.begin(),edge.end(),cmp);
int t=edge.size();
for (int i=;i<t;i++)
{
int x=edge[i].u;
int y=edge[i].v;
int tx=find(x);
int ty=find(y);
if (tx!=ty)
{
f[tx]=ty;
G[x].push_back(make_pair(y,edge[i].w));
G[y].push_back(make_pair(x,edge[i].w));
}
} for (int i=;i<=n;i++)
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
dfs(i); for (int j=;j<=n;j++)
if (dis[j]!=a[i][j])
{
return ;
}
}
return ;
} int main()
{ scanf("%d",&n);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
scanf("%d",&a[i][j]); for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
if (a[i][j]!=a[j][i]||i==j&&a[i][j]!=)
{
puts("NO");
return ;
}
if (i!=j&&a[i][j]==)
{
puts("NO");
return ;
}
} if (solve()) puts("YES");
else puts("NO");
return ;
}

代码可能更好说明思路,关键一点是:我们每次把最短的边加入集合。我们确定这是一颗最小生成树!所以加边次序是和MST是一样的。

第二种做法不得不佩服!1

这个特种点很难在比赛中发现啊

关键点:我们知道一个点到其他所有点都有一条最小距离的边--假设A到其他点最小距离的点是B,A-B一定是直接连接的。假设距离是X。

然后假设一个点C,C到B点要么比C到A点近X,要么C到A点远X。具体可以画图。

通过这个方法可以判断数据是否合法!

代码超级短

 #include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define N 2222 int a[N][N];
int n;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
scanf("%d",&a[i][j]); //预处理判断
int flag=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
if (i!=j&&a[i][j]==) flag=;
if (i==j&&a[i][j]!=) flag=;
if (i!=j&&a[i][j]!=a[j][i]) flag=;
} if (flag)
{
puts("NO");
return ;
} for (int i=;i<=n;i++)
{
int inf= ;//初始的值要比较大些
int pos=-;
for (int j=;j<=n;j++){
if (i==j) continue;
if (a[i][j]<inf)
{
inf =a[i][j];
pos=j;
}
}
for (int j=;j<=n;j++)
{
if (i==j||j==pos) continue;
if (abs(a[i][j]-a[pos][j])!=inf)
{
puts("NO");
return ;
}
}
} puts("YES");
return ;
} 后面的基本是水体了:
C:贪心:
从第一的判断每次找合理值,矛盾就错误!
B:
我是用贪心的做法!
想想我们最后电梯还是要回到第一层!对吧!
也要走到最高层,当前有人想去的最高层!
那么我们每次把前K高层的先送上去!就能满足答案最小!
 #define N 111111
using namespace std; int a[];
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,k;
cin>>n>>k; for (int i=;i<=n;i++) cin>>a[i];
sort(a+,a+n+,cmp);
int ans=;
for (int i=;i<=n;i+=k)
ans+=(a[i]-)*; cout<<ans<<endl;
return ;

复杂度O(N^2);时间600MS;这是快


Codeforces Round #270 D C B A的更多相关文章

  1. Codeforces Round #270 1003

    Codeforces Round #270 1003 C. Design Tutorial: Make It Nondeterministic time limit per test 2 second ...

  2. Codeforces Round #270 1002

    Codeforces Round #270 1002 B. Design Tutorial: Learn from Life time limit per test 1 second memory l ...

  3. Codeforces Round #270 1001

    Codeforces Round #270 1001 A. Design Tutorial: Learn from Math time limit per test 1 second memory l ...

  4. Codeforces Round #270 A~D

    Codeforces Round #270 A. Design Tutorial: Learn from Math time limit per test 1 second memory limit ...

  5. Codeforces Round #270(利用prim算法)

    D. Design Tutorial: Inverse the Problem time limit per test 2 seconds memory limit per test 256 mega ...

  6. codeforces水题100道 第七题 Codeforces Round #270 A. Design Tutorial: Learn from Math (math)

    题目链接:http://www.codeforces.com/problemset/problem/472/A题意:给你一个数n,将n表示为两个合数(即非素数)的和.C++代码: #include & ...

  7. 多种方法过Codeforces Round #270的A题(奇偶法、打表法和Miller_Rabin(这个方法才是重点))

    题目链接:http://codeforces.com/contest/472/problem/A 题目: 题意:哥德巴赫猜想是:一个大于2的素数一定可以表示为两个素数的和.此题则是将其修改为:一个大于 ...

  8. Codeforces Round #270 D Design Tutorial: Inverse the Problem --MST + DFS

    题意:给出一个距离矩阵,问是不是一颗正确的带权树. 解法:先按找距离矩阵建一颗最小生成树,因为给出的距离都是最短的点间距离,然后再对每个点跑dfs得出应该的dis[][],再对比dis和原来的mp是否 ...

  9. Codeforces Round #270

    A 题意:给出一个数n,求满足a+b=n,且a+b均为合数的a,b 方法一:可以直接枚举i,n-i,判断a,n-i是否为合数 #include<iostream> #include< ...

随机推荐

  1. Activiti系列: 如何给内置表单添加字段类型

     对于内置的表单,除了原来支持的几种数据类型(string, long, enum, date, boolean, collection)之外,还可以自定义数据类型,比如增加一个javascript数 ...

  2. php 正则表达式捕获组与非捕获组

    熟练掌握正则表达式是每个程序员的基础要求,对于每个初学者来说会被正则表达式一连串字符弄得头晕眼花.博主便会如此,一直对正则表达式有种莫名的恐惧.近来看到另一位博友写的 <php正则表达式> ...

  3. javascript基于原型实现面向对象

    传统的OO语言有类的概念,但js(ES5)却是基于原型实现的面向对象. 原型是?我们创建的每一个函数都会有一个原型(prototype)属性,这个属性是一个指针,指向函数的原型(prototype)对 ...

  4. 《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  5. angular的canvas画图例子

    angular的例子: <!DOCTYPE html> <html ng-app="APP"> <head> <meta charset= ...

  6. redmine慢---提速方法

    最近readmine速度越来越慢.网上查了一下,把其自带的服务器webrick 换成为mongrel,可以解决这个问题,具体操作方法如下,方法: gem install mongrel 如果提示类似“ ...

  7. beta发布排序结果

    排序结果 序号 组名 组长 项目简称 1 飞天小女警 沈柏杉 选礼物 1 奋斗吧兄弟 黄兴 食物链 3 天天向上 王森 连连看 4 金洲勇士 尹良亮 考试 5 新蜂 武志远 俄罗斯 6 nice! 李 ...

  8. SSH框架整合配置所需JAR包(SSH整合)

    转载于:http://www.cnblogs.com/kaige123/p/5719662.html Hibernate Jar: 1.hibernate3.jar,这个是hibernate3.0的核 ...

  9. 【HDU 1445】Ride to School

    题 题意 骑自行车,等0时开始最早出发的人,一起出发,然后被别人超过时,就追上去,终点距离是4.5km,速度单位是km/s,求到达的时间(s). 分析 贪心,找0时开始最早到的即可. 代码 #incl ...

  10. 洛谷P1136 迎接仪式

    题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的 ...