座位安排

今天,在机房里做了这道题目,我来整理一下思路。

首先读懂题意,这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座位安排的更多相关文章

  1. 洛谷——P2071 座位安排 seat.cpp/c/pas

    P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...

  2. 洛谷 P2071 座位安排 seat.cpp/c/pas

    P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...

  3. 【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas

    ∵每个座位可以坐俩人,所以拆点最大匹配. #include<cstdio> #include<vector> #include<cstring> using nam ...

  4. 洛谷P2071 座位安排

    题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...

  5. [洛谷P2365] 任务安排

    洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...

  6. 洛谷P2365 任务安排(斜率优化dp)

    传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...

  7. 洛谷 P1160 队列安排 Label:链表 数据结构

    题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为:老师 ...

  8. 洛谷 P1160 队列安排

    题目描述 一个学校里老师要将班上 NNN 个同学排成一列,同学被编号为 $1-N$ ,他采取如下的方法: 先将 111 号同学安排进队列,这时队列中只有他一个人: 2−N2-N2−N 号同学依次入列, ...

  9. 2018.07.09 洛谷P2365 任务安排(线性dp)

    P2365 任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

随机推荐

  1. window Linux 双系统安装

    我是先安装的win10,然后在其基础上又安装了Ubuntu 16.04,为了今后再次安装方便,这里记录一下安装过程. 我在安装时主要参考了文章:https://blog.csdn.net/flyyuf ...

  2. java将错误信息写入文件

    第一种办法可以通过字符串,也就是先把错误信息写入字符串,再将字符串写入文件 import java.io.*; public class Demo { public static void main( ...

  3. java二分法搜索

    二分法就是要将数据每次都分成两份然后再去找到你想要的数据 在二分法查找时要求传入的数据必须已经有序,假设现在为升序,然后每次将所寻找的值与中间值(数组左边界+(右边界-左边界)/2)作比较,大了则去寻 ...

  4. R和Python,对抗or融合?

    来源商业新知网,原标题:从对抗到融合,教你充分利用R+Python! 我们应该将关注点放在技能上,而不是工具上. 如果你从事数据科学的工作,可能会立即想到两种编程语言:R和Python. 事实上,R和 ...

  5. react组件开发规范总结

    开发react也有一段时间了,一开始的随手写,生命周期乱用,无状态组件的不熟悉.现在逐渐规范一下,从网上各个地方copy过来,整理出一份文档.可能不全,后续还得多提炼总结和完善. 一.组件内方法书写, ...

  6. jmeter学习笔记--线程组

    jmeter组件:线程组 是什么? 进程:一个正在执行的程序对应一个进程 线程:进程中的执行线索(一个进程中有多个执行线索) 线程组:按照线程性质对线程进行分组 并发执行:多个线程同时进行    特点 ...

  7. [TestNG] [WARN] Ignoring duplicate listener : org.testng.IDEATestNGRemoteListenerEx

    1. 使用6.10,和6.14.3版本testng,出现多条warn信息 [TestNG] [WARN] Ignoring duplicate listener : org.testng.IDEATe ...

  8. Java框架spring 学习笔记(十四):注解aop操作

    回见Java框架spring Boot学习笔记(十三):aop实例操作,这里介绍注解aop操作 首先编写一个切入点HelloWorld.java package com.example.spring; ...

  9. docker学习-lnmp+redis之搭建redis容器服务

    1. 目录映射:/lnmp/data/redis:/data/lnmp/conf/redis/redis.conf:/etc/redis/redis.conf/lnmp/logs/redis:/var ...

  10. python之元组及其方法---整理集

    元组: 区别:与列表类似,是对列表的二次加工:用小括号包括起来:元素不可修改:不可增加.删除 技巧:创建元组的时候,一般在最后一个元素后面加一个逗号:为了与方法区分:并且这个逗号不算元素例如: tu= ...