猫粮: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. 简单理解Linux File的操作

    类Unix系统是支持多个进程打开同一个文件,进行读写. 得益于类Unix系统对于文件操作的特殊设计. 分为三个数据结构 进程表项:其中包含进程中打开的文件和设备的文件描述符.还包含该文件描述符对应的文 ...

  2. Jenkis 简单介绍—持续集成、持续交付的工具

    Jenkis是什么? 首先是一款持续集成.持续交付的工具. Jenkis的思想是自动化部署:当我们向版本库提交最新的代码后,应用服务器(tomcat)就会自动从Git / svn上拉取最新的包,再重新 ...

  3. 使用Tesseract进行图片文字识别

    Tesseract介绍 Tesseract 是一个开源的光学字符识别(OCR)引擎,最初由 HP 在 1985 年至 1995 年间开发,后来被 Google 收购并开源.Tesseract 支持多种 ...

  4. DataGridView频繁更新PLC报警信息数据源

    1.问题描述 当DataGridView频繁更新数据源时,可能会导致界面闪烁.性能下降等问题.这是因为每次更新数据源时,DataGridView都需要重新绘制和绑定数据,这是一个相对耗时的过程. 2. ...

  5. 06C++顺序结构与程序IPO模式

    一.程序IPO模式 编程 IPO 是指输入.处理和输出(Input, Process, Output)的概念.在计算机编程中,IPO 是一种常用的设计模式,用于描述程序的基本流程.具体来说,IPO 指 ...

  6. Docker 使用 buildx 构建多种系统架构支持的镜像

    在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像.该命令支持 --platform 参数可以同时构建支持多种系统架构的 Do ...

  7. Redis 的DB多个数据库使用

    Redis 自己安装默认提供了16个数据库. 每个数据库都有一个id, 从 0 开始,(0,15). 不同的数据库中数据隔离保存.我们可以通过修改redis的配置文件进行修改数据库的数量. /etc/ ...

  8. Qt编写的项目作品12-简易视频播放器

    一.功能特点 多线程实时播放rtsp视频流. 支持windows+linux+mac. 多线程显示图像,不卡主界面. 自动重连网络摄像头. 可设置边框大小即偏移量和边框颜色. 可设置是否绘制OSD标签 ...

  9. 将maven项目打包上传到私服

    1. 配置私服账户密码 在maven 的setting.xml 中配置用户名和密码: <servers> <server> <username>deployment ...

  10. [转]swing中如何将jtable中的数据导入到excel中?

    这个版本的代码是可以支持中文,需要导入jxl.jar包,并添加到Build Path中(自行搜索下载). 最终代码: package test; import java.awt.event.*; im ...