码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 4742: [Usaco2016 Dec]Team Building

时间:2017-01-05 21:08:06      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:void   include   higher   bzoj   building   first   计算   off   led   

4742: [Usaco2016 Dec]Team Building

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 21  Solved: 16
[Submit][Status][Discuss]

Description

Every year, Farmer John brings his NN cows to compete for "best in show" at the state fair. His arch
-rival, Farmer Paul, brings his MM cows to compete as well (1≤N≤1000,1≤M≤1000).Each of the N+MN+
M cows at the event receive an individual integer score. However, the final competition this year wi
ll be determined based on teams of KK cows (1≤K≤10), as follows: Farmer John and Farmer Paul both 
select teams of KK of their respective cows to compete. The cows on these two teams are then paired 
off: the highest-scoring cow on FJ‘s team is paired with the highest-scoring cow on FP‘s team, the s
econd-highest-scoring cow on FJ‘s team is paired with the second-highest-scoring cow on FP‘s team, a
nd so on. FJ wins if in each of these pairs, his cow has the higher score.Please help FJ count the n
umber of different ways he and FP can choose their teams such that FJ will win the contest. That is,
 each distinct pair (set of KK cows for FJ, set of KK cows for FP) where FJ wins should be counted. 
Print your answer modulo 1,000,000,009.
每年农夫约翰都会带着他的N只牛去集会上参加“你是最棒哒“的比赛。他的对手农夫保罗也带了M只牛去参加比赛
(1 ≤ N ≤ 1000, 1 ≤ M ≤ 1000)。每只牛都有自己的分数。两人会选择K只牛组成队伍(1 ≤ K ≤ 10),两队
牛在按分数大小排序后一一配对,并且约翰打败保罗当且仅当对于每一对牛,约翰的牛分数都比保罗的高。请帮助
约翰计算约翰打败保罗的方案数 mod 1000000009。两种方案不同,当且仅当约翰或保罗选择的牛的集合与另一种
方案不同。
 

 

Input

The first line of input contains N, M, and K. The value of K will be no larger than N or M.
The next line contains the N scores of FJ‘s cows.
The final line contains the M scores of FP‘s cows.
 

 

Output

Print the number of ways FJ and FP can pick teams such that FJ wins, modulo 1,000,000,009.
 

 

Sample Input

10 10 3
1 2 2 6 6 7 8 9 14 17
1 3 8 10 10 16 16 18 19 19

Sample Output

382

HINT

 

Source

[Submit][Status][Discuss]

 

看到网上还没有人写题解,来抢百度的沙发好了(不知道抢的抢不上)。

 

就是一道水水的动态规划了:首先得给两个序列分别排个序,$f[i][j][k]$表示使用FJ的前i头牛,以及FP的前j头牛,组出k头牛的战斗序列的方案数。$f[i][j][k]$向$f[i+1][j][k]$和$f[i][j+1][k]$转移,分别代表不选择FJ的第i头牛以及不选择FP的第j头牛,$f[i][j][k]$向$f[i+1][j+1][k+1]$转移当且仅当FJ的第i+1头牛能胜过FP的第j+1头牛。发现$f[i+1][j][k]$和$f[i][j+1][k]$向$f[i+1][j+1][k]$都有转移,而事实上这两次转移的方案是一样的,简言之,算重了,咋办,减掉就好,所以$f[i+1][j+1][k]-=f[i][j][k]$。

 

 1 #include <cstdio>
 2 #include <algorithm>
 3 
 4 inline int nextChar(void) {
 5     const int siz = 1024;
 6     
 7     static char buf[siz];
 8     static char *hd = buf + siz;
 9     static char *tl = buf + siz;
10     
11     if (hd == tl)
12         fread(hd = buf, 1, siz, stdin);
13         
14     return *hd++;
15 }
16  
17 inline int nextInt(void) {
18     register int ret = 0;
19     register int neg = false;
20     register int bit = nextChar();
21     
22     for (; bit < 48; bit = nextChar())
23         if (bit == -)neg ^= true;
24         
25     for (; bit > 47; bit = nextChar())
26         ret = ret * 10 + bit - 48;
27         
28     return neg ? -ret : ret;
29 }
30 
31 const int siz = 1005;
32 const int mod = 1000000009;
33 
34 int n, m, d;
35 
36 int a[siz];
37 int b[siz];
38 
39 int f[siz][siz][15];
40 
41 inline void add(int &a, int b)
42 {
43     a += b;
44     
45     if (a >= mod)
46         a -= mod;
47         
48     if (a < 0)
49         a += mod;
50 }
51 
52 signed main(void)
53 {
54     n = nextInt();
55     m = nextInt();
56     d = nextInt();
57     
58     for (int i = 1; i <= n; ++i)
59         a[i] = nextInt();
60         
61     for (int i = 1; i <= m; ++i)
62         b[i] = nextInt();
63         
64     std::sort(a + 1, a + 1 + n);
65     std::sort(b + 1, b + 1 + m);
66     
67     f[0][0][0] = 1;
68     
69     for (int i = 0; i <= n; ++i)
70         for (int j = 0; j <= m; ++j)
71             for (int k = 0; k <= d; ++k)
72                 if (f[i][j][k])
73                 {
74                     add(f[i + 1][j][k], f[i][j][k]);
75                     add(f[i][j + 1][k], f[i][j][k]);
76                     add(f[i + 1][j + 1][k], -f[i][j][k]);
77                     
78                     if (a[i + 1] > b[j + 1])
79                         add(f[i + 1][j + 1][k + 1], f[i][j][k]);
80                 }
81                 
82     printf("%d\n", f[n][m][d]);
83 }

 

@Author: YouSiki

 

BZOJ 4742: [Usaco2016 Dec]Team Building

标签:void   include   higher   bzoj   building   first   计算   off   led   

原文地址:http://www.cnblogs.com/yousiki/p/6253701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!