【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛

组合计数

  排列组合求总方案数

  这个可以用一个一维的动态规划解决:

    f[i][0]表示第i头牛是牝牛的方案数

    f[i][1]表示第i头牛是牡牛的方案数

    则转移为:f[i][0]=f[i-1][0]+f[i-1][1];

       f[i][1]=f[i-K-1][0]+f[i-K-1][1];

常数优化:将取模运算改为if判断语句……可从20ms降为16ms

 1 /**************************************************************
 2     Problem: 3398
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:16 ms
 7     Memory:1588 kb
 8 ****************************************************************/
 9
10 //BZOJ 3398
11 #include<cstdio>
12 #define F(i,j,n) for(int i=j;i<=n;++i)
13 int getint(){
14     int v=0,sign=1; char ch=getchar();
15     while(ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();}
16     while(ch>=‘0‘&&ch<=‘9‘) {v=v*10+ch-‘0‘; ch=getchar();}
17     return v*=sign;
18 }
19 const int N=100086,P=5000011;
20 int f[N][2],n,K;
21 int main(){
22     n=getint(); K=getint();
23     f[1][0]=f[1][1]=1;
24     F(i,2,n){
25         if(i-K-1>0) f[i][1]=f[i-K-1][0]+f[i-K-1][1];
26         else f[i][1]=1;
27         f[i][0]=f[i-1][0]+f[i-1][1];
28         if(f[i][0]>=P) f[i][0]-=P;
29         if(f[i][1]>=P) f[i][1]-=P;
30     }
31     printf("%d\n",(f[n][0]+f[n][1])%P);
32     return 0;
33 }

时间: 2024-10-09 15:33:44

【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛的相关文章

BZOJ 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛( dp )

水题...忘了取模就没1A了.... --------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int MOD = 5000011; const int maxn = 100009; int dp[maxn], n, k; int main() { cin >> n >> k;

[BZOJ3398] [Usaco2009 Feb]Bullcow 牡牛和牝牛(动态规划)

3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 235  Solved: 159[Submit][Status][Discuss] Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛. 请计算一共有多少种排

bzoj3398[Usaco2009 Feb]Bullcow 牡牛和牝牛*

bzoj3398[Usaco2009 Feb]Bullcow 牡牛和牝牛 题意: n头牛,其中有牡牛和牝牛两种,要求任意两只牡牛中要有k只牝牛,问几种方案.n≤100000 题解: dp.f[i]表示第i头牛为牡牛的方案数,f[i]=sigma(j,1,i-k-1)f[j],这个可以用前缀和维护,最后答案为sigma(i,1,n)f[i]. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm&g

bzoj:3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛. 请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模 Input 一行,输入两个整数N和K. Output 一个整数,表示排队的方法数. Sample Input 4 2 Sample Output 6 初二在纪中集训的时候

bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)

原题链接 题目描述:约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛.请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模. 输入格式:一行,输入两个整数N和K. 输出格式:一个整数,表示排队的方法数. 输入样例: 4 2 输出样例: 6 解析:一道比较简单的题,直接组合数算一下即可. 代码如下:

Bullcow 牡牛和牝牛(bzoj 3398)

Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有K(O≤K<N)只牝牛. 请计算一共有多少种排队的方法.所有牡牛可以看成是相同的,所有牝牛也一样.答案对5000011取模 Input 一行,输入两个整数N和K. Output 一个整数,表示排队的方法数. Sample Input 4 2 Sample Output 6 样例说明 6种方法分

道路翻新 (Revamping Trails, USACO 2009 Feb)

题意:给定m<=50000的1-n有联通的图,求最多可以使K<=20条边变为0的情况下的最短路是多少.. 思路:简单的分层图最短路,对于每个点拆成K个点.. 然后求一边最短路.. code: 1 /* 2 * Author: Yzcstc 3 * Created Time: 2014/11/5 19:25:47 4 * File Name: revamp.cpp 5 */ 6 #include<cstdio> 7 #include<iostream> 8 #includ

BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution

权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出,只要我们按照右端点排序,然后能塞多少就塞多少就一定是最优哒! 你们可以YY一下,如果一堆牛能下车就赶紧下是不是可以得出最优的呢,我感觉不对但是他们都说对 然后就是很基本的线段树维护区间的查询和修改了. 需要注意的一个小地方是如果是线段树修改区间右端点是要-1的,这个很显然. 下面是具体实现: 1 /

BZOJ 1592 Usaco 2008 Feb Making the Grade 路面修整 DP

题目大意:给出一个不整齐的路面,可以将一个路面升高或者降低,都需要话费|x - x'|的费用,把路面修正成单调不降或单调不升的最小花费是多少. 思路:路面的高度跨度有点大啊,先离散化.之后f[i][j] 表示到i为止路面保证单调不降并且最高高度为j的最小花费是多少,利用一个前缀和优化一下.单调不升也一样,简单DP水过.. CODE: #include <map> #include <cstdio> #include <cstring> #include <iost