2 排队

(lineup.pas/.c/.cpp)

【问题描述】

小sin所在的班有n名同学,正准备排成一列纵队,但他们不想按身高从矮到高排,那样太单调,太没个性。他们希望恰好有k对同学是高的在前,矮的在后,其余都是矮的在前,高的在后。如当n=5,k=3时,假设5人从矮到高分别标为1、2、3、4、5,则(1,5,2,3,4)、(2,3,1,5,4)、(3,1,4,2,5)都是可行的排法。小sin想知道总共有多少种可行排法。

【输入】

输入文件名为lineup.in。

一行两个整数n和k,意义见问题描述。

【输出】

输出文件名为lineup.out。

输出一个整数,表示可行排法数。由于结果可能很大,请输出排法数mod 1799999的值。

【输入输出样例】

lineup.in

lineup.out

5 3

15

【数据范围】

对于20%的数据,有n≤10,k≤40;

对于60%的数据,有n≤100,k≤500;

对于100%的数据,有n≤100,k≤n*(n-1)/2。

解题报告

  像这样的题,也正如这套题一样的完全是思考的时间多。(哎,说得好像我做出来了一样,但其实我连样例都没有去想“天,15个,算了不想了。”所以啊,还是要有耐心,考场上一定要静下来,不要急躁,有同学用了两个小时找规律,最终不负有心人,全过了。)

  首先,我们需要找规律,而找规律不是随机就找到了,需要观察和对比两组甚至多组数据。于是,打开打表模式:

n\k  0   1   2   3   4   5   6

1     1   0   0   0   0   0   0

2     1   1   0   0   0   0   0

3     1   2   2   1   0   0   0

4     1   3   5   6   5   3   1

5     1   4   9  15  20 22 20 .......

   每一个n都有一个k的数量的限制,即长度 l ,如果k>l 就为0 ,l =0,1,3,6,等等。l+=i-1;  每一次都是在上一次的基础上添一个比上一次最大值大1的数,如下:

上一次:1 2 3 4 5

这一次添一个6 有6 种添法:在5后,在4~5间,在3~4间,在2~3间,在1~2间,在1前;

分别有6种增加的可能性:    不影响,多一组,  多两组,   多三组,   多四组,    多五组

  因此可以列出方程:f[i][j]( i 个数,取 j 组)=f[i-1][j]+f[i-1][j-1]+...+f[i-1][j-i+1]

    (转换):f[i][j-1]=f[i-1][j-1]+f[i-1][j-2]+...+f[i-1][j-i]

    (二式相减):f[i][j]=f[i][j-1]+f[i-1][j]-f[i-1][j-i]

  方程有了,代码就简单多了。

 #include<iostream>
#include<cstdio>
using namespace std;
int n,k;
int f[][];
const int inf=;
int main()
{
freopen("lineup.in","r",stdin);
freopen("lineup.out","w",stdout);
cin>>n>>k;
int l=;
for (int i=;i<=n;i++)
{
l+=i-;
f[i][]=;
for (int j=;j<=k;j++)
{
if (j>l) break;
f[i][j]=(f[i-][j]+f[i][j-])%inf;
if (j-i>=) f[i][j]=(f[i][j]-f[i-][j-i]+inf)%inf;
}
}
cout<<f[n][k];
return ;
}

神奇的Noip模拟试题一试 2 排队的更多相关文章

  1. 【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计

    1.      素数统计 (pcount.pas/.c/.cpp) [问题描述] 小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数.“这不是很简单吗?”小tan忍不住说.揣谙戈冷 ...

  2. 神奇的Noip模拟试题第一试 合理种植 枚举+技巧

    1.合理种植 (plant.pas/.c/.cpp) [问题描述] 大COS在氯铯石料场干了半年,受尽了劳苦,终于决定辞职.他来到表弟小cos的寒树中学,找到方克顺校长,希望寻个活干. 于是他如愿以偿 ...

  3. 神奇的Noip模拟试题 T3 科技节 位运算

    3 科技节 (scifest.pas/.c/.cpp) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...

  4. 9.23 noip模拟试题

      Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N ...

  5. 9.20 noip模拟试题

      Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我 ...

  6. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  7. 神奇的NOIP模拟赛 T1 LGTB 玩扫雷

    LGTB 玩扫雷 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 ...

  8. 11.14 noip模拟试题

      题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer ...

  9. 11.9 noip模拟试题

    NOIP2016 模拟赛——那些年,我们学过的文化课背单词(word.c/cpp/pas)[题目描述]fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词. 看着满篇的单词非常头疼, 而 ...

随机推荐

  1. C++——代码重用

    一.包含对象成员的类 接口和实现:使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口.不 ...

  2. Android监听Button和ImageButton控件的点击事件

    一.onClick事件 Button和ImageButton都有一个onClick事件,通过自身的.setOnClickListener(OnClickListener)方法添加点击事件 所有的控件都 ...

  3. Linux C编程一站式学习

    http://docs.linuxtone.org/ebooks/C&CPP/c/ 很全面的介绍

  4. linux 安装 easygui

    如果遇到问题也查找不到资料时,可以认真阅读安装文件下的README说明,或许可以得到帮助. 本次环境为redhat 6.4.python2.7.9 linux 图形化显示需要安装一些依赖包,比如lib ...

  5. 解决Tomcat: Can't load IA 32-bit .dll on a AMD 64-bit platform问题

    http://201209235316.iteye.com/blog/2063853 http://www.cnblogs.com/liuyp-ken/p/5503822.html

  6. Working with Data » 使用Visual Studio开发ASP.NET Core MVC and Entity Framework Core初学者教程

    原文地址:https://docs.asp.net/en/latest/data/ef-mvc/intro.html The Contoso University sample web applica ...

  7. fushioncharts的使用教程

    FusionCharts 是使用javascript 实现统计图表的js组件:其官网地址:http://www.fusioncharts.com.其早期版本FusionCharts Free 是基于f ...

  8. Junit4入门

    eclipse自带junit包,可右键直接新建junit类 静态引入:import static org.junit.Assert.* assert.*是类,静态引入会引入assert里的所有静态方法 ...

  9. (07)odoo扩展API

    * 打开XML-RPC 连接    >>> import xmlrpclib    >>> srv, db = 'http://localhost:8069', ' ...

  10. inout

    在函数声明时就用inout代替var  这样以后可以在函数内部修改外面的值 类似于C语言的传入指针 func change (inout num:Int) { num = 10 } var a = 2 ...