猫粮: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 ] [ 鸽巢原理 ]的更多相关文章

  1. [POJ3370]&[HDU1808]Halloween treats 题解(鸽巢原理)

    [POJ3370]&[HDU1808]Halloween treats Description -Every year there is the same problem at Hallowe ...

  2. 51nod 1574 排列转换(贪心+鸽巢原理)

    题意:有两个长度为n的排列p和s.要求通过交换使得p变成s.交换 pi 和 pj 的代价是|i-j|.要求使用最少的代价让p变成s. 考虑两个数字pi和pj,假如交换他们能使得pi到目标的距离减少,p ...

  3. [HDU1205]吃糖果 题解(鸽巢原理)

    [HDU1205]吃糖果 Description -HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次 ...

  4. [POJ2356]Find a multiple 题解(鸽巢原理)

    [POJ2356]Find a multiple Description -The input contains N natural (i.e. positive integer) numbers ( ...

  5. luogu P1126 机器人搬重物 题解

    luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...

  6. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  7. 【luogu P2491 [SDOI2011]消防】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2491 题外话: OI一共只有三种题--会的题,不会的题,二分题. 题解: step 1 求树的直径,把树的直 ...

  8. 洛谷 P4269 / loj 2041 [SHOI2015] 聚变反应炉 题解【贪心】【DP】

    树上游戏..二合一? 题目描述 曾经发明了零件组装机的发明家 SHTSC 又公开了他的新发明:聚变反应炉--一种可以产生大量清洁能量的神秘装置. 众所周知,利用核聚变产生的能量有两个难点:一是控制核聚 ...

  9. 【luogu P1040 加分二叉树】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1040 今天考试考了一个区间DP...没错就是这个... 太蒟了真是连区间DP都不会...看了看题解也看不懂, ...

  10. 【luogu P1783 海滩防御】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1783 先把题目改造一下:题目所求是要一条能从0列到n列的路径,使其路径上的最大边长一半最小. 为什么是一半呢 ...

随机推荐

  1. go get 和 go install 对比

    (一)命令定义和区别 go install 和 go get 都是 Go 语言的工具命令,但它们之间有一些区别. go get:用于从远程代码存储库(如 GitHub)中下载或更新 Go 代码包.它会 ...

  2. Node.js 模拟Apache服务器

    1.知识必备 (1)当服务器响应不同文件类型时,需要设置响应报文头,让浏览器选择相应的编码解析数据. 常用对照表HTTP Mime-type: https://tool.oschina.net/com ...

  3. 重磅推出 Sdcb Chats:一个全新的开源大语言模型前端

    重磅推出 Sdcb Chats:一个全新的开源大语言模型前端 在当前大语言模型(LLM)蓬勃发展的时代,各类 LLM 前端层出不穷.那么,为什么我们还需要另一个 LLM 前端呢? 最初的原因在于质感的 ...

  4. 重建sln的项目层级

    编写包含多个 csproj 的程序时,随着项目数量的持续增加,可能涉及一些文件夹的变动,手动添加项目或者变动会变得非常麻烦,这个时候,可以利用 dotnet cli 帮助我们完成. 如果从零开始,我们 ...

  5. 解锁4K,Xilinx MPSoC ARM + FPGA高清视频采集与显示方案!

    当下,随着数字化多媒体技术以令人惊叹的速度不断演进,高清视频处理成为众多领域关注的焦点.今天为大家分享4K HDMI 高清视频方案,基于Xilinx UltraScale+ MPSoC XCZU7EV ...

  6. 【Rive】眼睛互动动画

    1 前言 ​ 本文基于 Rive 社区开放的眼睛动画,进一步加工处理,实现更有趣的眼睛互动动画. ​ 原始资源见 → Eye Joysticks Demo,效果如下. ​ 原始资源只有一只眼睛,并且没 ...

  7. Qt/C++音视频开发77-获取本地有哪些摄像头名称/ffmpeg命令日志方式

    一.前言 上一篇文章讲使用ffmpeg函数接口去获取本地摄像头信息,这种方式只能从ffmpeg5版本开始才具备,那ffmpeg3/4只能干瞪眼?那肯定不行的,必须要想办法打通这个功能,查阅信息发现可以 ...

  8. 关于Qt高分屏缩放几个知识点

    在windows上经常遇到高分屏缩放的问题,很头疼,貌似这东西就是windows首发的. 在Qt4时代的程序遇到高分屏缩放,不作任何处理,毕竟Qt4时代(2010年以前)出来的时候几乎还没高分屏缩放这 ...

  9. Qt数据库应用16-通用数据库采集

    一.前言 数据库采集对应的就是上一篇文章的数据库同步,数据库同步到云端数据库以后,app.网页.小程序啥的要数据的话,可以通过执行http请求拿到数据,http接收应答这边程序一般最简单可以用php写 ...

  10. [转]Clion+mingw环境下Assimp编译

    1.Clion+mingw环境下Assimp编译 2.MinGW-w64下载