Codeforces 1209D. Cow and Snacks

传送门

考虑构建图论模型,每个客人看成边,菜看成点,那么每个客人连接他喜欢的两个菜

对于某个客人,如果他要开心,它连接的两点至少要有一个还未被选择

考虑一个显然的贪心,我们要尽量让每个客人只吃到一种菜

考虑构建一个生成树,每次从树上一个节点往外延伸,连向一个新的点,那之间的边就是新的一个客人

并且这样构建以后,除了第一个客人吃到了两种菜以外,其他客人都只吃到一种菜,显然是最优的

发现代码实现的时候生成树连边的顺序是没影响的,所以直接构建生成树森林,那么森林中的边数就是最多可以开心的客人

答案即为总人数减去最多开心的人数,并查集即可维护

由于我的代码过于丑陋并且可能是错的(虽然过了 $CF$ 的数据),思路也不是这个,所以请去看其他人的代码吧 $qwq$

比如这位不知名的神仙:birchtree    的代码

原文地址:https://www.cnblogs.com/LLTYYC/p/11526436.html

时间: 2024-08-29 07:52:27

Codeforces 1209D. Cow and Snacks的相关文章

D. Cow and Snacks 并查集

D. Cow and Snacks 题意:有n种小吃,m个人,每个人有两种喜欢的小吃,当一个人遇到两种自己都喜欢的小吃,可以都吃掉,问在最优的吃小吃顺序下,不能吃到自己喜欢的小吃的人数最少是多少? 题解:把n种小吃当作n个点,m个人当作m条边,每个连通图里面第一个吃的人,一定是可以吃两种自己喜欢的小吃.每次判断这条边是否在已有的联通图里面,对已经在连通图里面的边,是一定不能吃到小吃,若不在连通图里面,则一定可以吃到小吃,用cnt统计可以吃到小吃的人数,最后m-cnt就是答案 #include<i

Cow and Snacks(吃点心--图论转换) Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2)

题意:https://codeforc.es/contest/1209/problem/D 有n个点心,有k个人,每个人都有喜欢的两个点心,现在给他们排个队,一个一个吃,每个人只要有自己喜欢的点心就会吃掉(不会留给后面的人). 如果有人什么都没吃就会不开心,问怎么安排使不开心的人最少. 思路: 看成一个图的问题,点心是节点,人是一条边.对于每个连通块,总会有一个人吃两个点心,其他人吃一个(其中一个是其他人也就吃掉了的). 可以保证这样是最优的,所有每个连通块的答案是连通数 x-1. 1 #def

CodeForces - 283E Cow Tennis Tournament

Discription Farmer John is hosting a tennis tournament with his n cows. Each cow has a skill level si, and no two cows having the same skill level. Every cow plays every other cow exactly once in the tournament, and each cow beats every cow with skil

Codeforces 283E Cow Tennis Tournament 线段树 (看题解)

Cow Tennis Tournament 感觉这题的难点在于想到求违反条件的三元组.. 为什么在自己想的时候没有想到求反面呢!!!! 违反的三元组肯定存在一个人能打败其他两个人, 扫描的过程中用线段树维护一下就好了. 反思: 计数问题: 正难则反 正难则反 正难则反 !!!! #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi

Codeforces 283B Cow Program

题意:给你a[2] - a[n], 一个初始x = 1,初始y = 0  ,执行下面步骤 1) x +=a[x] ,y += a[x] 2) x -= a[x] ,y += a[x] 3)重复1-2步骤.只要中间x <=0 || x > n  就跳出.输出y的值 问你a[1] 从 [1,n-1]分别的值为多少. 解题思路:dfs 求 dp[i][0/1]  求以加法进入 i 和以减法进入 i 能得到的值. 解题代码: 1 // File Name: 283b.cpp 2 // Author:

Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2)

怎么老是垫底啊. 不高兴. 似乎 A 掉一道题总比别人慢一些. A. Paint the Numbers 贪心,从小到大枚举,如果没有被涂色,就新增一个颜色把自己和倍数都涂上. #include<bits/stdc++.h> #define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to) #define dbg(...) fprintf(stderr, __VA_ARGS__) #define F

codeforces #584 ABCD

A. Paint the Numbers Description Solution 水题 B. Koala and Lights Description Solution 模拟到1e4. C. Paint the Digits Description 给出一个序列,将序列每个值染色为1或2. 问能否给出一种染色序列使得12序列为排序后的序列. Solution 原序列排一遍序比较. 扫两遍,第一次染色1,第二次染色2. 判断染色序列是否完整覆盖原序列. 1 #include <algorithm

Codeforces Round #174 (Div. 2)---D. Cow Program(dp, 记忆化搜索)

Farmer John has just given the cows a program to play with! The program contains two integer variables, x and y, and performs the following operations on a sequence a1,?a2,?-,?an of positive integers: Initially, x?=?1 and y?=?0. If, after any step, x

Codeforces Round #621 (Div. 1 + Div. 2)B Cow and Friend

第一感觉最小步数只和移动距离的最大值有关 对于任一移动距离a,水平移动距离范围0~a   而跳两步水平移动距离范围0~2a 且两步对称 就能回到x轴  这样就和纵坐标无关了 贪心策略:水平跳动amax,直到剩下距离amax<res<2amax或为0,显然可以两步到达 证明:水平跳动显然amax最优,对于剩下的距离只用amax需要两步 其他移动距离或组合也至少需要两步 因为amax<res<2amax 而amax又是最大移动距离 此时答案$max(2,ceil(\frac{a}{b}