链接:https://ac.nowcoder.com/acm/contest/5026/C

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

众所周知,高考数学中有一个题目是给出12个单项选择,每一个选择的答案是 A,B,C,DA,B,C,DA,B,C,D 中的一个。 网上盛传答案存在某种规律,使得蒙对的可能性大大增加。于是今年老师想让你安排这12个题的答案。但是他有一些条件,首先四个选项的数量必须分别为na,nb,nc,ndna,nb,nc,ndna,nb,nc,nd。其次有 m 个额外条件,分别给出两个数字x,yx,yx,y,代表第 x 个题和第 y 个题的答案相同。 现在你的老师想知道,有多少种可行的方案安排答案。
输入描述:
第一行五个非负整数na,nb,nc,nd,m,保证na+nb+nc+nd=12,0≤m≤1000。接下来m行每行两个整数x,y(1≤x,y≤12)代表第x个题和第y个题答案必须一样第一行五个非负整数na,nb,nc,nd,m,保证na+nb+nc+nd=12,0≤m≤1000。接下来m行每行两个整数x,y(1≤ x,y ≤12)代表第x个题和第y个题答案必须一样第一行五个非负整数na,nb,nc,nd,m,保证na+nb+nc+nd=12,0≤m≤1000。接下来m行每行两个整数x,y(1≤x,y≤12)代表第x个题和第y个题答案必须一样。
输出描述:
仅一行一个整数,代表可行的方案数。

示例1

输入

3 3 3 3 0

输出

369600

简单的DP

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<vector>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
//#define int __int128
using namespace std;
typedef long long ll;//全用ll可能会MLE或者直接WA,试着改成int看会不会A
const ll N=15;
const ll INF=1e10+9;
const ll mod=2147483647;
const double EPS=1e-10;//-10次方约等于趋近为0
const double Pi=3.1415926535897;ll n,m,dp[N][N][N][N];
ll fa[N],sum,sz[N],size[N];
ll a[N],na,nb,nc,nd,cnt;inline void init()
{over(i,0,11)fa[i]=i,size[i]=1;
}inline ll finds(ll x)
{return fa[x]==x?x:fa[x]=finds(fa[x]);
}
inline void unite(ll x,ll y)
{ll a=finds(x),b=finds(y);if(a!=b){if(a>b)swap(a,b);fa[b]=a,size[a]+=size[b];}
}
int main()
{init();//服了,已经多少次了,写了init不写initscanf("%lld%lld%lld%lld%lld",&na,&nb,&nc,&nd,&m);while(m--){ll a,b;scanf("%lld%lld",&a,&b);a--,b--;unite(a,b);}over(i,0,12-1){if(fa[i]==i)//独立的题sz[cnt++]=size[i];}dp[0][0][0][0]=1;for(int i=0;i<cnt;++i){for(int a=0;a<=na&&a<=sum;++a){for(int b=0;b<=nb&&a+b<=sum;++b){for(int c=0;c<=nc&&a+b+c<=sum;++c){int d=sum-a-b-c;if(d>nd)continue;if(a+sz[i]<=na)dp[i+1][a+sz[i]][b][c]+=dp[i][a][b][c];if(b+sz[i]<=nb)dp[i+1][a][b+sz[i]][c]+=dp[i][a][b][c];if(c+sz[i]<=nc)dp[i+1][a][b][c+sz[i]]+=dp[i][a][b][c];if(d+sz[i]<=nd)dp[i+1][a][b][c]+=dp[i][a][b][c];}}}sum+=sz[i];}printf("%lld\n",dp[cnt][na][nb][nc]);return 0;
}

注:如果您通过本文,有(qi)用(guai)的知识增加了,请您点个赞再离开,如果不嫌弃的话,点个关注再走吧,日更博主每天在线答疑 ! 当然,也非常欢迎您能在讨论区指出此文的不足处,作者会及时对文章加以修正 !如果有任何问题,欢迎评论,非常乐意为您解答!( •̀ ω •́ )✧

牛客练习赛61 C 四个选项(并查集、DP、排列组合)难度⭐⭐⭐相关推荐

  1. 牛客练习赛61 C 四个选项 dp\搜索+组合数学

    https://ac.nowcoder.com/acm/contest/5026/C 思路一:dpdpdp,首先通过并查集处理出所有的连通块(限制条件),然后用dpi,x,y,z,wdp_{i,x,y ...

  2. 牛客练习赛24 B凤 凰(并查集考察)

    链接:https://www.nowcoder.com/acm/contest/157/B 来源:牛客网 题目描述 凤凰于飞,翙翙其羽,亦集爰止. --<诗经·卷阿> 传说,凤凰是百鸟之王 ...

  3. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

  4. 牛客练习赛 61(待补F-点分治?)

    A. 打怪 先求出每次打死一只怪需要掉多少血,然后就直接算出能够打死多少只. #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) ...

  5. 牛客练习赛61 - B - 吃水果

    题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个,即如果其中一种水果的数量为0,则他不能进行这个操作),或者使用魔法将某一种水果的数量翻倍. 现在米咔想吃西 ...

  6. 牛客练习赛61 B 吃水果 题解

    链接:https://ac.nowcoder.com/acm/contest/5026/B 来源:牛客网 题目描述 最近米咔买了n个苹果和m个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个, ...

  7. 牛客小白月赛25 C 白魔法师 并查集

    链接:https://ac.nowcoder.com/acm/contest/5600/C 来源:牛客网 题目描述 你是一个白魔法师. 现在你拿到了一棵树,树上有 个点,每个点被染成了黑色或白色. 你 ...

  8. 【牛客 - 368D】动态连通块(并查集+bitset优化)

    题干: 小T有n个点,每个点可能是黑色的,可能是白色的. 小T对这张图的定义了白连通块和黑连通块: 白连通块:图中一个点集V,若满足所有点都是白点,并且V中任意两点都可以只经过V中的点互相到达,则称V ...

  9. 牛客练习赛61 D 最短路变短了(最短路,反向最短路)难度⭐⭐⭐★

    最短路变短了 链接 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format:%lld 题目描述 给定一个有向带权图,其中 ...

最新文章

  1. MicroSoft的Office使用攻略
  2. YodaOS: 一个属于 Node.js 社区的操作系统
  3. EF Core 3.0查询
  4. 电脑装机完没有efi_电脑装机如何选内存?看完这篇就全懂了
  5. matlab制作强光效果代码,自己动手做一个雷达PPI显示器的动态效果图(附Matlab代码)...
  6. Maxwell与Canal 工具对比
  7. 【Vegas原创】远程桌面下重启xp系统的命令
  8. Windows平台安装cocos2d-x V3.17.2
  9. java编写flash相册的制作软件_flash相册制作大师免费版
  10. 解决无线路由器无法进行账号认证上网的问题
  11. python3调用arcpy地理加权回归_多元地理加权回归软件使用和含义
  12. 机器学习——专业名词
  13. Oracle 实体用户授权及同步同义词
  14. android实现刷卡功能,Android 实现银联刷卡机消费后手动签名的功能(示例代码)
  15. 怎么申请企业邮箱?手机怎么申请免费邮箱?
  16. Pikachu靶场-暴力破解
  17. UEStudio V17.00.0.25 免费版 代码编辑器
  18. 程序员的天堂还是地狱:论东南亚BC工厂
  19. Ironic console
  20. android点击展开内容,Android编程实现Listview点击展开和隐藏的方法

热门文章

  1. 基于OpenCV的行人目标检测
  2. 线性求[1,P-1]的逆元
  3. Qt之两种初始化QListWidget的方法
  4. spring的jar各包作用
  5. 反射 Class类和Class实例
  6. 巴菲特:买进你同学的10%
  7. 在Ubuntu14.04安装F.lux
  8. windows域设计best practice
  9. RAID0、RAID1、RAID0+1模式实战评测
  10. EF Code First执行SQL语句及存储过程