H 欢乐颂
登录—专业IT笔试面试备考平台_牛客网


思路:这个题就是题意比较难懂,思路还挺好想的,其实就是每个点都有几个状态,然后只有存在相同状态的点之间才可以连边,假设点i的状态和为a,点j的状态和为b,那么会有一条i到j的无向边,同时这个边的权值为a^b+1,然后让你找到一个树,如果找不到树则输出零,并且权值越小的边越会在树中,如果权值相同,那么就按照x*n+y,x为由边连接的两个点中编号更小的点的编号,其实这里就暗示我们直接用kruskal写一下就行了,然后可以写个并查集判断是不是一颗树,然后他要找到树中的两个点,使得这两个点的简单路径的和最大,那么这其实就是求一个树的直径,建完图之后跑两边dfs即可
// Problem: 欢乐颂
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/61657/H
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
J 睡美人
登录—专业IT笔试面试备考平台_牛客网

思路:因为最后必须要有m个,并且在合并后是m个,那么在合并后的状态就是 红蓝红蓝红蓝交替出现的,对于所有的方案来说,假设一共有n个,红一共有a个,那么总的方案就是C(n,a)个,对于交替的来说,因为它们在整序列中放的位置是确定的,只是不同的位置方的数量可能不一样,所以我们可以将红蓝单独拿出来,对m分为奇数偶数两种情况,如果m是奇数,那么存在两种情况,红m/2+1,蓝m/2,以及红m/2,蓝m/2+1,所以我们只需要求出来红分为m/2+1组的方案,假设一共有a个,那么我们可以使用隔板法,一共有a-1个空位置,需要方(m/2+1)-1个隔板,那么数量就是C(a-1,m/2),同理对于其他的我们也可以求出来,然后再运算一下即可
// Problem: 睡美人
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/61657/J
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include