洛谷P1386座位安排
座位安排
今天,在机房里做了这道题目,我来整理一下思路。
首先读懂题意,这n个人是不需要按1到n来一次安排的,也就是说你可以先安排任意一个人。
那么有一种很好排除的情况,那就是对于大于等于i的作为的需求量s[i]是不得超过n-i+1的,这个很好理解。
那么这个s[i]我们可以在读入内定的几个位置时,用一个叫use[i]的数组去处理,它表示内定为i的人有多少个,那么s[]也就出来了。
接下来我们需要预处理一下组合数,以后需要。
下面我们看一下核心,这道题目我们用的时dp
我们用f[i][j]表示对于大于等于i的位置在有j个已经确定的方案数,注意这里的确定,不是指内定的人数,而是指除了内定的人数之外,却定j个人,有多少种方案。
那么我们再来写转移方程。
这个应该就很好写了:
f[i][j]=∑k=0j(f[i+1][j−k]∗c[j][k])
也就是说当前确定j个人等于i+1位置之前的0到j个确定了的种数乘以对应的组合数。
什么意思?就是指如果从前面确定的j个人选出k个人不确定,有c[j][k]种选法。为什么要求和?这选出的k个人就相当于,从当前这个i位置放入。
所以这就是结果了。
下面贴代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=305;
int T,n,m,M;
bool flag;
long long use[maxn],s[maxn],c[maxn][maxn],f[maxn][maxn];
int main(){
scanf("%d",&T);
while(T--){
memset(use,0,sizeof(use));
memset(s,0,sizeof(s));
memset(c,0,sizeof(c));
memset(f,0,sizeof(f));
scanf("%d%d%d",&n,&m,&M);
flag=true;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
use[y]++;
}
for(int i=n;i>=1;i--){
s[i]=s[i+1]+use[i];
if(s[i]>n-i+1){
flag=false;
break;
}
}
if(!flag){
printf("NO\n");
continue;
}
for(int i=0;i<=n;i++){
c[i][0]=c[i][i]=1;
for(int j=1;j<i;j++){
c[i][j]=(c[i-1][j-1]+c[i-1][j])%M;
}
}
f[n+1][0]=1;
for(int i=n;i>=1;i--){
for(int j=0;j<=n-i+1-s[i];j++){
for(int k=0;k<=j;k++){
f[i][j]=(f[i][j]+f[i+1][j-k]*c[j][k])%M;
}
}
}
printf("YES %d\n",f[1][n-m]);
}
return 0;
}
洛谷P1386座位安排的更多相关文章
- 洛谷——P2071 座位安排 seat.cpp/c/pas
P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...
- 洛谷 P2071 座位安排 seat.cpp/c/pas
P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...
- 【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas
∵每个座位可以坐俩人,所以拆点最大匹配. #include<cstdio> #include<vector> #include<cstring> using nam ...
- 洛谷P2071 座位安排
题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...
- [洛谷P2365] 任务安排
洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...
- 洛谷P2365 任务安排(斜率优化dp)
传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...
- 洛谷 P1160 队列安排 Label:链表 数据结构
题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为:老师 ...
- 洛谷 P1160 队列安排
题目描述 一个学校里老师要将班上 NNN 个同学排成一列,同学被编号为 $1-N$ ,他采取如下的方法: 先将 111 号同学安排进队列,这时队列中只有他一个人: 2−N2-N2−N 号同学依次入列, ...
- 2018.07.09 洛谷P2365 任务安排(线性dp)
P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...
随机推荐
- visual studio开启多核编译方法《转》
原文:https://blog.csdn.net/acaiwlj/article/details/50240625 visual studio在编译时可以启动多核并行编译,以减少编译所需时间.话不多说 ...
- es集群搭建
1.复制5份es,版本要相同,且各个节点上jdk版本也要相同,否则会报数据同步格式不一致 invalid internal transport message format. 2.配置elastic ...
- tcp那个孤独的小包到底怎么回事?
内核3.10,接<tcp的发送端一个小包就能打破对端的delay_ack么?> 我们继续来分析这个没满mss的小包, 可以看到,由于受到syn ack这端是发包端,所以该发送链路协商的ms ...
- 关于Eclipse for Python
学习Python一段时间,一直用Python的IDE进行开发,过程蛮顺利,但是,基于Visual Studio的使用经验,就希望尝试一种更友好的,更方便管理项目的IDE,分别尝试了PyCharm和Ec ...
- [phvia/dkc] Docker Compose 快速构建(LNMP+Node)运行环境
快速构建(LNMP+Node)运行环境. dkc 在此作为 docker-compose 的缩写,你可以理解为 alias dkc=docker-compose 准备 安装 docker 选择1) 从 ...
- lanya
var app = getApp() Page({ data: { motto: 'Hello World', openBLE:'打开蓝牙设备', startBLEDiscover ...
- Functional Language
1.What is functional language? 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定 ...
- 小A买彩票-(组合数)
链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 题目描述 小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富.已知购买一张彩票需要3元,而彩票 ...
- express 内存溢出问题分析定位
一.现象 1. 如下报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: n ...
- php 配置xdebug
https://blog.csdn.net/Alan8865/article/details/81331252