Luogu P11628 WC2025 猫粮 题解 [ 绿 ] [ 贪心 ] [ adhoc ] [ 鸽巢原理 ]
猫粮:WC 诈骗题。我竟然能切 WC 的 T3 也是逆天了。
话说切了猫粮能变成猫娘吗 qwq。
思路
首先题目里有下面几点关键的性质:
- 所有猫粮质量总和等于所有猫要吃的质量总和。
- 优质的有
袋,普通的也有 袋,一共 只喵。 - 所有猫粮质量都小于
。
因此我们可以得出以下结论:
- 任何猫都不能多吃猫粮,必须恰好吃到
。 - 任何单独的一个猫粮都不能喂饱一只喵。
- 喂饱一只喵至少需要两袋猫粮。
- 根据鸽巢原理,因为一共只有
袋猫粮,而一只喵至少要吃两袋猫粮,所以每只喵只能恰好吃两袋猫粮,否则就有喵不够吃。
到这里这题做法基本上就出来了,再根据
- 用一个普通猫粮和一个优质猫粮,这种方式是最优的。
- 用两个普通猫粮,这种方式尽量少用,因为没有办法消耗掉优质猫粮。
- 用两个优质猫粮,这种方式一般只能在其他所有猫粮都用完的时候用(也就是一般最多只能用一次),否则因为随机性会导致某只猫多吃。
再根据猫粮两两质量不同的部分分,我们可以想到一个 corner:当其他全匹配完了,剩下多个优质猫粮,且优质猫粮质量相等时,是可以吃完的。
于是,这题做法就是:
- 先拿普通猫粮去匹配优质猫粮,尽可能将优质猫粮多匹配掉。
- 如果一个普通猫粮无法匹配,则尝试用两个普通猫粮,此处注意特判当两个普通猫粮相等时数量必须大于等于
。如果依然无法匹配,则说明无解。 - 对于剩下的优质猫粮,如果全部质量相等或者只有两个,则说明可以内部匹配掉,有解;否则无解。
我们可以利用桶实现,时间复杂度
代码
#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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验