Luogu P11628 WC2025 猫粮 题解 [ 绿 ] [ 贪心 ] [ adhoc ] [ 鸽巢原理 ]
猫粮:WC 诈骗题。我竟然能切 WC 的 T3 也是逆天了。
话说切了猫粮能变成猫娘吗 qwq。
思路
首先题目里有下面几点关键的性质:
- 所有猫粮质量总和等于所有猫要吃的质量总和。
- 优质的有 \(n\) 袋,普通的也有 \(n\) 袋,一共 \(n\) 只喵。
- 所有猫粮质量都小于 \(m\)。
因此我们可以得出以下结论:
- 任何猫都不能多吃猫粮,必须恰好吃到 \(m\)。
- 任何单独的一个猫粮都不能喂饱一只喵。
- 喂饱一只喵至少需要两袋猫粮。
- 根据鸽巢原理,因为一共只有 \(2n\) 袋猫粮,而一只喵至少要吃两袋猫粮,所以每只喵只能恰好吃两袋猫粮,否则就有喵不够吃。
到这里这题做法基本上就出来了,再根据 \(m=3\) 的部分分的匹配方式,我们喂饱一只喵有如下方式:
- 用一个普通猫粮和一个优质猫粮,这种方式是最优的。
- 用两个普通猫粮,这种方式尽量少用,因为没有办法消耗掉优质猫粮。
- 用两个优质猫粮,这种方式一般只能在其他所有猫粮都用完的时候用(也就是一般最多只能用一次),否则因为随机性会导致某只猫多吃。
再根据猫粮两两质量不同的部分分,我们可以想到一个 corner:当其他全匹配完了,剩下多个优质猫粮,且优质猫粮质量相等时,是可以吃完的。
于是,这题做法就是:
- 先拿普通猫粮去匹配优质猫粮,尽可能将优质猫粮多匹配掉。
- 如果一个普通猫粮无法匹配,则尝试用两个普通猫粮,此处注意特判当两个普通猫粮相等时数量必须大于等于 \(2\)。如果依然无法匹配,则说明无解。
- 对于剩下的优质猫粮,如果全部质量相等或者只有两个,则说明可以内部匹配掉,有解;否则无解。
我们可以利用桶实现,时间复杂度 \(O(t(n+m))\)。
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
const int N=100005;
int n,m;
int a[N],b[N],tota[N],totb[N],cnt=0,kd=0;
void solve()
{
cin>>n>>m;
memset(tota,0,sizeof(tota));memset(totb,0,sizeof(totb));
kd=0;cnt=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
tota[a[i]]++;
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
totb[b[i]]++;
}
bool lg=1;
for(int i=1;i<=n;i++)
{
if(totb[b[i]]<=0)continue;
if(tota[m-b[i]]>0)tota[m-b[i]]--,totb[b[i]]--;
else if((totb[m-b[i]]>0&&(b[i]!=m-b[i]))||(totb[m-b[i]]>=2)){totb[m-b[i]]--;totb[b[i]]--;}
else lg=0;
}
for(int i=1;i<=m;i++)
{
if(tota[i])kd++;
while(tota[i]){tota[i]--,cnt++;}
}
if(!(kd<=1||cnt<=2))lg=0;
if(lg)cout<<"Yes\n";
else cout<<"No\n";
}
int main()
{
// freopen("catfood.in","r",stdin);
// freopen("catfood.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)solve();
return 0;
}
Luogu P11628 WC2025 猫粮 题解 [ 绿 ] [ 贪心 ] [ adhoc ] [ 鸽巢原理 ]的更多相关文章
- [POJ3370]&[HDU1808]Halloween treats 题解(鸽巢原理)
[POJ3370]&[HDU1808]Halloween treats Description -Every year there is the same problem at Hallowe ...
- 51nod 1574 排列转换(贪心+鸽巢原理)
题意:有两个长度为n的排列p和s.要求通过交换使得p变成s.交换 pi 和 pj 的代价是|i-j|.要求使用最少的代价让p变成s. 考虑两个数字pi和pj,假如交换他们能使得pi到目标的距离减少,p ...
- [HDU1205]吃糖果 题解(鸽巢原理)
[HDU1205]吃糖果 Description -HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次 ...
- [POJ2356]Find a multiple 题解(鸽巢原理)
[POJ2356]Find a multiple Description -The input contains N natural (i.e. positive integer) numbers ( ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- 【luogu P2491 [SDOI2011]消防】 题解
题目链接:https://www.luogu.org/problemnew/show/P2491 题外话: OI一共只有三种题--会的题,不会的题,二分题. 题解: step 1 求树的直径,把树的直 ...
- 洛谷 P4269 / loj 2041 [SHOI2015] 聚变反应炉 题解【贪心】【DP】
树上游戏..二合一? 题目描述 曾经发明了零件组装机的发明家 SHTSC 又公开了他的新发明:聚变反应炉--一种可以产生大量清洁能量的神秘装置. 众所周知,利用核聚变产生的能量有两个难点:一是控制核聚 ...
- 【luogu P1040 加分二叉树】 题解
题目链接:https://www.luogu.org/problemnew/show/P1040 今天考试考了一个区间DP...没错就是这个... 太蒟了真是连区间DP都不会...看了看题解也看不懂, ...
- 【luogu P1783 海滩防御】 题解
题目链接:https://www.luogu.org/problemnew/show/P1783 先把题目改造一下:题目所求是要一条能从0列到n列的路径,使其路径上的最大边长一半最小. 为什么是一半呢 ...
随机推荐
- Linux之查看开放端口
在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.SC端口等等 ...
- vue项目中如何加载markdown
场景 今天忽然临时接到一个需求: 就是将markdown文件直接在vue项目中进行加载,并正常显示出来. 这......,我知道是可以进行加载markdown文件的. 但是我之前没有做过,答复的是:可 ...
- 从零开始学java(第二天)
------------恢复内容开始------------ 今天是学习了一些基础的知识 1.注释 //行注释 /*多行注释*/ /**文档注释*/ 2.标识符和关键字 标识符就是名字,类名方法名变量 ...
- .NET 使用 ZXing.Net 生成二维码,并识别
.NET 使用 ZXing.Net 生成二维码,并识别 前言 前面已经分享给很多创建二维码,条形码...等一系列的方式 各有优缺点,暂时不做评价.今天推荐ZXing.Net .也是比较全面的一种方式, ...
- 一个使用 WPF 开发的管理系统
前言 最近发现有不少小伙伴在学习 WPF,今天大姚给大家分享一个使用 WPF 开发的管理系统,该项目包含了用户登录.人员管理.角色授权.插件管理.职位管理.主页功能(邮件.皮肤.设置)等功能,对于一个 ...
- Oracle无法远程连接的原因及解决办法
前提 虚拟机Linux(centos7)下静默安装Oracle数据库,本地能访问.文章参考:Linux-CentOS7下安装Oracle11g - sankuoshu - 博客园 (cnblogs.c ...
- Winserver主副域控切换的方法
查看当前的dc netdom query dc 步骤 登录主域控(PDC),例如主域控的主机名为dc01.yourdomaincontroller.com (FQDN 格式) 打开CMD命令行终端, ...
- k3d 入门:在 Docker 中运行 k3s
k3d 入门:在 Docker 中运行 k3s https://www.xtplayer.cn/k3d/introduction-k3d-run-k3s-docker-src/#The-"S ...
- 【UI框架】ANtDesignVue中的Content超过一页显示问题
假设content部分是绿色 当内容超出一页之后,滑下去,后面的都没有底色. 如果footer有内容,content的内容甚至会和footer内容重叠在一起,同时,footer的内容随着下滑,位置就不 ...
- 【Python】数据分析与可视化实践:收支日统计数据可视化的实现
Python数据分析与可视化实践:收支日统计数据可视化的实现 Author:萌狼蓝天 Date:2023-5-7 数据读入与基本处理 上图是原始数据的一部分,存放于excel中,首先使用pd读入数据. ...