座位安排

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

首先读懂题意,这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. Mac谷歌浏览器跨域

    1.创建一个文件夹,这个文件夹是用来保存关闭安全策略后的用户信息的,名字可以随意取,位置也可以随意放,我用的是MyChromeDevUserData open -n /Applications/Goo ...

  2. 关于JVM加载内存图学习小密招

    先看如下代码: Person.java public class Person { private String name; private int age; static int count = 0 ...

  3. Hibernate 中出现 users is not mapped 问题

    Hibernate 中出现 users is not mapped 问题: 解答:HQL语句中表名应该是ORM映射的类名,所以应该改成:  (如果是用注解生成实体类,那就是注解的那个类)String ...

  4. S8-codelab02

    import news_cnn_model import numpy as np import os import pandas as pd import pickle import shutil i ...

  5. 关于导入zepto出错的问题

    一.前言 webpack在配置多页面开发的时候 ,发现用 import 导入 Zepto 时,会报 Uncaught TypeError: Cannot read property 'createEl ...

  6. C#移动及改变控件大小

    //代码比较简单,就不多解析了. #region 移动窗体保存数据 Point mouseOff;//鼠标移动位置变量 bool leftFlag; //标志是否为左键 bool largeFlag; ...

  7. 错误: 找不到或无法加载主类 hello.class

    今天复习Java,弄了一个helloworld,然后发现报错了,后来发现,原来执行的时候不能在后面添加.class

  8. ES6学习笔记(数组)

    1.扩展运算符:, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 用于函数调用 function add(x, y) { r ...

  9. 23. Merge k Sorted Lists (JAVA)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  10. 20175126《Java程序设计》第三学习总结

    # 20175126 2016-2017-2 <Java程序设计>第三周学习总结 ##课余收获——利用JAVA编写最简单的斗地主程序 -由于最近身边的朋友都在玩手机上的斗地主小游戏,我也就 ...