CF #177 div2 练习

2014-11-01 15:04:00

总结:

A:英语阅读理解题。

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Thu 30 Oct 2014 02:01:09 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,k;
28 
29 int main(){
30     int a,b,sum = 0;
31     scanf("%d%d",&n,&k);
32     for(int i = 1; i <= n; ++i){
33         scanf("%d%d",&a,&b);
34         sum += b - a + 1;
35     }
36     if(sum % k == 0) printf("0\n");
37     else printf("%d\n",k - sum % k);
38     return 0;
39 }
View Code

B:将所有数排个序,要考虑

 1 /*************************************************************************
 2     > File Name: b.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Thu 30 Oct 2014 02:24:49 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,d;
28 int a[110 * 110];
29 int vis[10010];
30 
31 int main(){
32     scanf("%d%d%d",&n,&m,&d);
33     int top = n * m;
34     for(int i = 1; i <= top; ++i)
35         scanf("%d",a + i);
36     sort(a + 1,a + top + 1);
37     int flag = 1,ans2 = 0;
38     for(int i = 1; i <= top; ++i){
39         if((a[i] - a[1]) % d){
40             flag = 0;
41             break;
42         }
43         ans2 += abs(a[i] - a[top / 2 + 1]) / d;
44     }
45     if(flag) printf("%d\n",ans2);
46     else printf("-1\n");
47     return 0;
48 }
View Code

C:简单构造题。。

 1 /*************************************************************************
 2     > File Name: c.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Thu 30 Oct 2014 05:53:21 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,k;
28 
29 int main(){
30     scanf("%d%d",&n,&k);
31     if(k > n || (k == 1 && n > 1)){
32         printf("-1\n");
33     }
34     else{
35         if(k == 1)
36             printf("a\n");
37         else{
38             int len = n - k + 2,flag = 1;
39             while(len--){
40                 if(flag) printf("a");
41                 else printf("b");
42                 flag = 1 - flag;
43             }
44             for(int i = 1; i <= k - 2; ++i)
45                 printf("%c",'b' + i);
46         }
47     }
48     return 0;
49 }

D:这题很有意思,首先考虑:k+1....n之间的数不能回到1....k,所以k+1...n之间的数可以取的数的范围:[k+1,n],方案数是(n-k)^(n-k),前面k个数的要求是:从任意一个点出发能回到1,(每个牌匾构造出一条边),k个点有k条边。我们发现,如果图中有环,那么环必须包含1这个点,否则不符合要求。那么我们先把1号点的出边去掉,且把边看成无向,那么图就必须是一颗生成树(k个点,(k-1)条边),根据Caley定理,n个点能构成n^(n-2)棵生成树,所以k个点k-1条边能形成k^(k-2)棵生成树。因为此时树边是无向的,而题目中的边是有向的,但是因为要让2...k点都能回到1号点,所以每条边实际上都指向根,否则不满足要求,因此我们能给每颗生成树确定唯一的方向。此时再把刚刚去掉的1号点的出边加回来,由于1号点的出边可以指向k个节点中的任意一个。所以方案数是:k*k^(k-2) = k^(k-1),最终方案数就是:k^(k-1) * (n-k)^(n-k)。

 1 /*************************************************************************
 2     > File Name: d.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sat 01 Nov 2014 02:01:05 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,k;
29 
30 int main(){
31     scanf("%d%d",&n,&k);
32     ll ans = 1;
33     for(ll i = 1; i < k; ++i) ans *= k;
34     for(ll i = n - k; i >= 1; --i) ans = (ans * (n - k)) % mod;
35     printf("%I64d\n",ans);
36     return 0;
37 }

 

posted @ 2014-11-01 15:33  Naturain  阅读(141)  评论(0编辑  收藏  举报