E. Two Round Dances #圆排列

题目链接

题意

\(n\)(保证偶数)个人,要表演一个节目,这个节目包含两种圆形舞蹈,而每种圆形舞蹈恰好需要\(n/2\)个人,每个人只能跳一种圆形舞。

一个节目中两支舞蹈中的人编号组成一条圆环。故两个节目,对应两个圆环排列。两个不相同的节目,等价于,两个圆排列是不同的,现要你求出他们能做出多少种不同的节目。

分析

圆排列:从\(n\)个不同元素选取\(r\)个元素,不分首尾地围成一个圆圈的排列。

其排列方案数为:\(\frac{A^r_n}{r}\)。特别地,当\(n=r\)时,\(\frac{A^n_n}{n}\)可以进一步得到\((n-1)!\)

从\(n\)个人抽取\(\frac{n}{2}\)个人,有\(C^{\frac{n}{2}}_n\)分法,相应地另一组\(\frac{n}{2}\)也定下来。接下来考虑内部的排列,第一组的\(\frac{n}{2}\)个人进行圆排列有\((\frac{n}{2}-1)!\)个方案,第二组也有\((\frac{n}{2}-1)!\)个方案,由乘法原理得到最终答案:\(C^{\frac{n}{2}}_n \times (\frac{n}{2}-1)! \times(\frac{n}{2}-1)! \times \frac{1}{2}\). 最终答案之所以乘这个\(\frac{1}{2}\)是因为第一组的排列与第二组的排列可交换的。下面的代码是对上式进行了化简。

#include <string>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <stack>
#include <cmath>
#include <queue>
#include <map>
#include <vector>
#include <deque>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef long double ld;
const int MAXN = 75;
ll n;
int main(){
scanf("%lld", &n);
ll ans = 1;
for(int i = 1; i <= n; i++) ans *= (ll)i;
ans *= (ll)2;
ans /= (ll)(n * n);
printf("%lld\n", ans);
return 0;
}

G. Reducing Delivery Cost #最短路径 #暴力

题目链接

题意

\(n\)个点\(m\)条双向路,第\(i\)条路花费为\(w_i\)。现在有\(k\)个快递员,他们各自有不同的出发地\(a_i\)与目的地\(b_i\)。你现在可以从原\(m\)条双向路中选择至多一条的路,将该条路的花费置为\(0\)。现要你求出\(k\)个快递员的最小花费总和。其中\(2 \le n \le 1000, n - 1 \le m \le min(1000, \frac{n(n-1)}{2})\)

分析

由于题目需要我们询问多组的不同起点至终点的最短距离,同时考虑到数据的规模才\(1e3\),于是我们暴力地枚举每个顶点,计算从这个顶点出发到另外点的最短距离——通过\(dijkstra\)算法。

但是题目还没完,它还附加了条件,可以选择一条边权值至零。因为只能操作一条边,且边数量不大,直接枚举所有要删除的边,然后删去这个边后更新每个快递员的最短距离。

注意,在更新的过程中,一定要两个方向同时更新!

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <unordered_map>
#include <stack>
#include <queue>
#include <iostream>
using namespace std;
typedef long long ll;
typedef long long ld;
const int MAXN = 1e3 + 5;
int n, m, k, tot, H[MAXN], dis[MAXN][MAXN];
struct Edge {
int from, to, nextNbr, w;
}E[MAXN << 1];
void addEdge(int u, int v, int w) {
tot++;
E[tot].from = u;
E[tot].to = v;
E[tot].nextNbr = H[u];
E[tot].w = w;
H[u] = tot;
}
typedef struct qnode { //存放在优先队列中
int u, dis;
bool operator <(const struct qnode& oth) const {
return dis > oth.dis;
}
} qnode;
struct Route { //记录每个快递员的路径起点与终点
int st, ed;
}Route[MAXN];
void dijstra(int st) { //求出以st为起点,到达其他点的最短路径
for (int i = 1; i <= n; i++) dis[st][i] = 0x3f3f3f3f;
dis[st][st] = 0;
priority_queue<qnode> myque;
myque.push({ st, 0 });
while (!myque.empty()) {
int u = myque.top().u, curdis = myque.top().dis;
myque.pop();
if (curdis != dis[st][u]) continue;
for (int i = H[u]; i >= 0; i = E[i].nextNbr) {
int v = E[i].to, w = E[i].w;
if (u == v) continue;
if (dis[st][u] + w < dis[st][v]) {
dis[st][v] = dis[st][u] + w;
myque.push({ v, dis[st][v] });
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++) H[i] = -1;
for (int i = 1, u, v, w; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
addEdge(v, u, w);
}
int ans = 0x3f3f3f3f;
for (int i = 1; i <= n; i++) dijstra(i);
for (int i = 1; i <= k; i++) scanf("%d%d", &Route[i].st, &Route[i].ed);
for (int i = 1; i <= tot; i+=2) { //【先】枚举需要去除的边,因为只能去除一条边
int u = E[i].from, v = E[i].to;
int sum = 0;
for (int j = 1; j <= k; j++) { //【后】枚举去掉该边后,更新每个快递员的最短路径
int st = Route[j].st, ed = Route[j].ed;
sum += min(dis[st][ed],
min(dis[st][u] + dis[v][ed], dis[st][v] + dis[u][ed]));
} //注意!!!一定要从两个方向取最小值
ans = min(ans, sum);
}
printf("%d\n", ans);
return 0;
}

Codeforces Round #677 (Div. 3) E、G题解的更多相关文章

  1. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  2. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  3. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  4. Codeforces Round #672 (Div. 2) A - C1题解

    [Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...

  5. Codeforces Round #677 (Div. 3) G. Reducing Delivery Cost(dijkstra算法)

    题目链接:https://codeforces.com/contest/1433/problem/G 题解 跑 \(n\) 遍 \(dijkstra\) 得到任意两点间的距离,然后枚举哪一条边权为 \ ...

  6. Codeforces Round #677 (Div. 3)【ABCDE】

    比赛链接:https://codeforces.com/contest/1433 A. Boring Apartments 题解 模拟即可. 代码 #include <bits/stdc++.h ...

  7. Educational Codeforces Round 46 (Div 2) (A~G)

    目录 Codeforces 1000 A.Codehorses T-shirts B.Light It Up C.Covered Points Count(差分) D.Yet Another Prob ...

  8. Codeforces Round #614 (Div. 2) A-E简要题解

    链接:https://codeforces.com/contest/1293 A. ConneR and the A.R.C. Markland-N 题意:略 思路:上下枚举1000次扫一遍,比较一下 ...

  9. Codeforces Round #610 (Div. 2) A-E简要题解

    contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...

随机推荐

  1. 计算机CPU是怎么认识代码的?

    先说一下半导体,啥叫半导体?就是介于导体和绝缘体中间的一种东西,比如二极管.   电流可以从A端流向C端,但反过来则不行.你可以把它理解成一种防止电流逆流的东西. 当C端10V,A端0V,二极管可以视 ...

  2. oracle 存储过程深入学习与应用

    对于存储过程已经有过一周的学习时间了,但是之学到一些皮毛,争取根据基础,熟练后能进行深入. --1.存储过程创建存储过程的语法: CREATE [ OR REPLACE ] PROCEDURE pro ...

  3. 【实战】记一次老项目的swagger整合

    1.背景 这两天接到一个整合swagger的任务,本以为很简单,预计两小时内完成,没想到其中有太多的坑,整了两天才完成. 首先项目是一个比较老的项目,之前用的servlet,目前在重构为springm ...

  4. 文本的3D效果

    HTML <div class="g-box"> <h1>CSS的世界很美</h1> </div> CSS .g-box { wid ...

  5. 4G DTU和4G工业路由器有哪些区别?

    DTU的英文全称是Data Transfer unit,是一种专门用来将将IP数据转换为串口数据或者是将串口数据转换为IP数据并且通过无线通信网络将数据进行传送的无线终端设备.DTU也可以实现无线网络 ...

  6. Linux编译内核 Ubuntu18.04 -2020.11.04

    Linux编译内核 Ubuntu18.04 -2020.11.04 关闭虚拟机并备份 首先关闭虚拟机,其次直接找到.vmdk所在目录,并压缩该目录实现备份 下载内核源码 Linux内核官网:https ...

  7. 不能再被问住了!ReentrantLock 源码、画图一起看一看!

    前言 在阅读完 JUC 包下的 AQS 源码之后,其中有很多疑问,最大的疑问就是 state 究竟是什么含义?并且 AQS 主要定义了队列的出入,但是获取资源.释放资源都是交给子类实现的,那子类是怎么 ...

  8. 【Android Studio】安卓开发初体验2——Activity

    Activity是什么 Activity用于提供可视化用户界面的组件,可以与用户进行交互来完成某项任务,一个应用程序中可以包含零个或多个活动 Activity的创建 首先将左侧的Active Tool ...

  9. 6.1 接口 - 6.3 lambda表达式

    6.1 接口 接口概念 接口是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义.设计目的是解决多继承的问题 接口中所有方法时 public 不用现实声明 java.lang.Comparab ...

  10. 阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密,我搞清楚了

    之前已经详细.全面地介绍了 Log4j,相信小伙伴们已经完全掌握了.那我在读嵩山版的阿里巴巴开发手册(没有的小伙伴,记着找我要)的时候,就发现了一条「强制」性质的日志规约: 应用中不可以直接使用日志系 ...