首页 > 其他分享 >abc310D 带限制的分组方案数

abc310D 带限制的分组方案数

时间:2024-03-27 18:34:17浏览次数:25  
标签:方案 return insert forbid ll dfs 分组 abc310D rep

将n个人分成T组,有m条限制条件,第i个条件为{a[i],b[i]},表示a[i]与b[i]不能分到同一组,问总共有多少种可行的分组方案?
1<=T<=n<=10

由于最多只有10人,直接爆搜也能过,可以再加个剪枝:如果剩下人每人单独一组都不够T组则不可行。另外,为了去重,可以按编号从小到大的顺序,依次考虑每个人,要么加到已有的组里,要么自成一组。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll inf = 1e18;
#define rep(i,a,b) for(ll i=a; i<=b; i++)
#define per(i,a,b) for(ll i=b; i>=a; i--)
////////////////////////////////////////////////////
ll n, T, m, ans;
set<ll> g[15];
set<pair<ll,ll>> forbid;
void dfs(ll x, ll t) {
    if (x > n) {
        if (t == T) {
            ans += 1;
        }
        return;
    }
    if (t > T) {
        return;
    }
    if (n-x+1+t < T) {
        return;
    }
    rep(i,1,t) {
        int ok = 1;
        for (auto i : g[i]) {
            ll j = x;
            if (i > j) swap(i, j);
            if (forbid.count({i,j}))
                ok = 0;
        }
        if (ok) {
            g[i].insert(x);
            dfs(x+1, t);
            g[i].erase(x);
        }
    }
    g[t+1].insert(x);
    dfs(x+1, t+1);
    g[t+1].erase(x);
}
void solve() {
    cin >> n >> T >> m;
    rep(i,1,m) {
        ll a, b;
        cin >> a >> b;
        if (a > b) swap(a, b);
        forbid.insert({a,b});
    }
    dfs(1, 0);
    cout << ans << "\n";
}
////////////////////////////////////////////////////
int main() {
    int t = 1;
    while (t--) solve();
    return 0;
}
int myinit = []() {
    cin.tie(0)->sync_with_stdio(0);
    return 0;
}();

标签:方案,return,insert,forbid,ll,dfs,分组,abc310D,rep
From: https://www.cnblogs.com/chenfy27/p/18099970

相关文章

  • AI智能分析网关智慧食安监管系统方案
    3.15晚会刚过不久,淀粉肠的“屈辱”终于得以洗清,但某些品牌奶茶、梅菜扣肉、预制菜等等,生产过程仍是触目惊心。如何提升食品安全管理水平,保障食品从生产到消费环节的质量和安全?TSINGSEE青犀智利用智能分析网关V4+EasyCVR相结合,打造了以下慧食安智能监控方案。1、食品加工生产环......
  • AI智能分析网关V4数字农场智能监控方案
    随着大数据时代的到来,数据成为国家基础性战略资源,加快数字化转型、以数字化谋求国际竞争新优势已成为全球普遍共识,利用大数据推动经济发展、优化社会治理、改善公共服务成为了世界各国的必然选择。农村为实现产业转型升级和治理创新,提升农场数字化、网络化、智能化基础设施水平,也......
  • 红外额温枪芯片方案ZHW3548
    红外额温枪作为一款红外测温的电子产品,最开始是用于工业测温,但随着时代的发展,逐渐的发展为医疗行业使用。红外额温枪最核心的功能就是对人体做实时测温,并且可以在不接触人体情况下直接测温,这种功能在疫情期间尤为重要,可以降低疾病的传播性。红外额温枪其特点在于具备了精度高,......
  • Spring Boot 工程开发常见问题解决方案,日常开发全覆盖
    本文是SpringBoot开发的干货集中营,涵盖了日常开发中遇到的诸多问题,通篇着重讲解如何快速解决问题,部分重点问题会讲解原理,以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题,既方便自己也方便他人,老鸟和新手皆适合,值得收藏......
  • 统计将重叠区间合并成组的方案数.18098728
    统计将重叠区间合并成组的方案数给你一个二维整数数组ranges,其中ranges[i]=[starti,endi]表示starti到endi之间(包括二者)的所有整数都包含在第i个区间中。你需要将ranges分成两个组(可以为空),满足:每个区间只属于一个组。两个有交集的区间必须在同一个组内......
  • Unity在旋转时出现万向节锁的解决方案
    关于万向节锁在Unity官方文档中有这样的描述:欧拉角在变换坐标中,Unity使用矢量属性Transform.eulerAngles X、Y和Z显示旋转。与法线矢量不同,这些值实际上表示绕X、Y和Z轴旋转的角度(以度为单位)。欧拉角旋转围绕三个轴执行三个单独的旋转。Unity依次围绕z轴、x轴和y......
  • ADAS 冒烟测试介绍与解决方案
    随着智能网联汽车市场的快速发展,各大汽车厂商为了提升产品的竞争力和满足消费者的需求,纷纷推出了具备丰富智驾功能的汽车产品,但同时产品快速升级过程中的软件迭代也为智驾控制器功能安全测试带来了不小的挑战。如何在快速迭代的软件更新过程中进行高效测试执行、提前发现软件BUG、......
  • pandas笔记(五)-- 部门工资最高的员工(数据表的合并与分组)
    题目描述输入employee表和department表,查询部门工资最高的员工,按任意顺序返回结果表测试用例employee表:idnamesalarydepartmentId1Joe7000012Jim9000013Henry8000024Sam6000025Max900001department表:idname1IT......
  • 一套集群实时在线扩容为两套集群方案
    一套集群实时在线扩容为两套集群方案解决问题:当一套集群A承担不了业务压力,需要在A集群在线情况下,扩出来一套与A集群完全一样的B集群,之后从业务层面控制A和B各自承担原A承担的一半业务压力。1、配置A集群1.1A集群创建用户并赋权selectfrompg_userwhere;......
  • 故障转移群集(Failover Cluster Instances)和AlwaysOn是SQL Server中两种不同的高可用性
    故障转移群集(FailoverClusterInstances)和AlwaysOn是SQLServer中两种不同的高可用性解决方案。它们在实现高可用性的方式上有一些显著的区别:故障转移群集(FailoverClusterInstances):故障转移群集是一种基于WindowsServer故障转移群集技术的解决方案,它使用共享存储并在主......