CF #178 div2 练习

2014-10-30 13:53:38

A:话不多,模拟。

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Wed 29 Oct 2014 11:05:04 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int n,m;
28 int a[105];
29 
30 int main(){
31     int x,y;
32     scanf("%d",&n);
33     for(int i = 1; i <= n; ++i)
34         scanf("%d",&a[i]);
35     scanf("%d",&m);
36     for(int i = 1; i <= m; ++i){
37         scanf("%d%d",&x,&y);
38         if(x > 0) a[x - 1] += y - 1;
39         if(x < n) a[x + 1] += a[x] - y;
40         a[x] = 0;
41     }
42     for(int i = 1; i <= n; ++i)
43         printf("%d\n",a[i]);
44     return 0;
45 }
View Code

B:这题有点意思,由于书的厚度只有1和2两种,所以按1和2两种厚度分别存,然后分别按书我宽度(w)降序排序,暴力两层循环找最优解。

  (一开始还逗比的想怎么贪心,哎,题目一定要看清,思路清楚后才敲,谨记)

 1 /*************************************************************************
 2     > File Name: b.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Wed 29 Oct 2014 11:11:41 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int n,c1,c2;
28 int v1[105],v2[105];
29 int s1[105],s2[105];
30 
31 bool cmp(int u,int v){
32     return u > v;
33 }
34 
35 int main(){
36     c1 = c2 = 0;
37     int a,b;
38     scanf("%d",&n);
39     for(int i = 1; i <= n; ++i){
40         scanf("%d%d",&a,&b);
41         if(a == 1) v1[++c1] = b;
42         else v2[++c2] = b;
43     }
44     sort(v1 + 1,v1 + c1 + 1,cmp);
45     sort(v2 + 1,v2 + c2 + 1,cmp);
46     s1[0] = s2[0] = 0;
47     int ans = INF;
48     for(int i = 1; i <= c1; ++i) s1[i] = s1[i - 1] + v1[i];
49     for(int i = 1; i <= c2; ++i) s2[i] = s2[i - 1] + v2[i];
50     for(int i = 0; i <= c1; ++i){
51         for(int j = 0; j <= c2; ++j){
52             if(i + 2 * j >= s1[c1] - s1[i] + s2[c2] - s2[j]){
53                 ans = min(ans,i + 2 * j);
54                 break;
55             }
56         }
57     }
58     printf("%d\n",ans);
59     return 0;
60 }
View Code

C:挺好的一道数学题,考了许多细节。一共有n-m个灯等待去点,考虑简单情况:设某两盏开着的灯间有k个暗着的灯,那么易得方案数:2^(k - 1),可以这么想:在n-m步中选择k步去处理这两盏灯间的暗灯,所以这部分对答案的贡献:C(k,n - m) * 2^(k - 1),然后考虑每一对相邻的亮灯,最后处理一下开头和结尾即可。

  这里复习了一下预处理组合数取模,另外要注意一个细节:如果两亮灯间没有暗灯的话要跳过去不然会造成答案为0的情况!

 1 /*************************************************************************
 2     > File Name: c.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Wed 29 Oct 2014 11:57:08 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 const int mod = 1000000007;
27 
28 int n,m;
29 ll v[1010];
30 ll c[1010][1010],fac[1010];
31 ll ans;
32 
33 void Pre(){
34     for(int i = 1; i <= 1000; ++i){
35         c[i - 1][0] = 1;
36         for(int j = 1; j <= i; ++j)
37             c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
38     }
39     fac[0] = 1;
40     for(int i = 1; i <= 1000; ++i)
41         fac[i] = (fac[i - 1] * 2) % mod;
42 }
43 
44 int main(){
45     Pre();
46     scanf("%d%d",&n,&m);
47     for(int i = 1; i <= m; ++i)
48         scanf("%I64d",v + i);
49     sort(v + 1,v + m + 1);
50     int sum = n - m;
51     if(sum == 0){
52         printf("1\n");
53         return 0;
54     }
55     ans = c[sum][v[1] - 1] % mod;
56     sum -= v[1] - 1;
57     for(int i = 1; i < m; ++i){
58         int num = v[i + 1] - v[i] - 1;
59         if(num == 0) continue;
60         //ans = (ans * ((fac[num - 1] * c[sum][num]) % mod)) % mod;
61         ans = ((fac[num - 1] * c[sum][num]) % mod * ans) % mod;
62         sum -= num;
63     }
64     printf("%I64d\n",ans);
65     return 0;
66 }

 

posted @ 2014-10-30 14:00  Naturain  阅读(179)  评论(0编辑  收藏  举报