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;
}
posted @   KS_Fszha  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示