CF #270 NO div

2014-09-29 17:02:42

昨晚的CF真是声势浩大,5400+人,7题,2.5小时。呼呼,只搞了3题,第四题思路差不多就是敲不起来,还是太弱QAQ。

A:不多说,奇数减9,偶数减8即可。(随便减个奇/偶合数就行)

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sun 28 Sep 2014 11:36:12 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define lpos (pos << 1)
18 #define rpos (pos << 1|1)
19 #define getmid(l,r) (l + (r - l) / 2)
20 typedef long long ll;
21 const int INF = 1 << 29;
22 
23 int n;
24 
25 int main(){
26     scanf("%d",&n);
27     if(n & 1) printf("9 %d\n",n - 9);
28     else printf("8 %d\n",n - 8);
29     return 0;
30 }
View Code

B:降序排序,k个k个送上去,不多说了。

 1 /*************************************************************************
 2     > File Name: b.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sun 28 Sep 2014 11:46:46 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define lpos (pos << 1)
18 #define rpos (pos << 1|1)
19 #define getmid(l,r) (l + (r - l) / 2)
20 typedef long long ll;
21 const int INF = 1 << 29;
22 
23 int n,k;
24 int f[3000];
25 
26 bool cmp(int a,int b){
27     return a > b;
28 }
29 
30 int main(){
31     scanf("%d%d",&n,&k);
32     for(int i = 1; i <= n; ++i){
33         scanf("%d",&f[i]);
34     }
35     sort(f + 1,f + n + 1,cmp);
36     int cnt = 0,ans = 0,tmax;
37     for(int i = 1; i <= n; ++i){
38         if(cnt == 0) tmax = f[i];
39         ++cnt;
40         if(cnt == k || i == n){
41             ans += 2 * (tmax - 1);
42             cnt = 0;
43         }
44     }
45     printf("%d\n",ans);
46 }
47         
View Code

C:字符串排序,用string比较方便,不多说了,贪心一下就行。

 1 /*************************************************************************
 2     > File Name: c.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sun 28 Sep 2014 11:58:16 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <string>
15 #include <iostream>
16 #include <algorithm>
17 using namespace std;
18 #define lpos (pos << 1)
19 #define rpos (pos << 1|1)
20 #define getmid(l,r) (l + (r - l) / 2)
21 typedef long long ll;
22 const int INF = 1 << 29;
23 
24 int n;
25 string f[100010];
26 string s[100010];
27 int p[100010];
28 
29 int main(){
30     string tmp;
31     cin >> n;
32     for(int i = 1; i <= n; ++i){
33         cin >> f[i] >> s[i];
34         if(f[i] > s[i]){
35             tmp = f[i];
36             f[i] = s[i];
37             s[i] = tmp;
38         }
39     }
40     for(int i = 1; i <= n; ++i){
41         scanf("%d",&p[i]);
42     }
43     int flag = 1;
44     tmp = f[p[1]];
45     for(int i = 2; i <= n; ++i){
46         if(f[p[i]] > tmp){
47             tmp = f[p[i]];
48         }
49         else if(s[p[i]] > tmp){
50             tmp = s[p[i]];
51         }
52         else{
53             flag = 0;
54             break;
55         }
56     }
57     if(flag) printf("YES\n");
58     else printf("NO\n");
59     return 0;
60 }
View Code

D:总感觉挺水的,感觉直接搜索判断能过,但是没敲出来。赛后发现是MST+搜索。然后再一看别人代码发现写的其实很简单,只是用到了MST的思想罢了。

思路:首先,如果是带权树的话,对其求一次MST的话得到的邻接矩阵就是题目输入数据。其实也不用边排+Kru什么的,直接选(一般从1开始)一个点 (设为a) ,选出其所有出边中最短的边(设为a -> b),可以证明这条边一定在MST中,那么根据这条边对其他点做一次扫描,考虑a到所有点k的路径,如果发现没用到 a -> b 这条边,则图不符合要求!abs(d[a][k] - d[b][k]) ?= dis(a -> b),通过这条式子来判断即可(式子中abs包含了k是否和b在a的同一侧这两种情况),考虑完MST的所有边,如果没有矛盾就是YES(思考)

(本题要注意特判!)

 1 /*************************************************************************
 2     > File Name: d.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com
 5     > Created Time: Mon 29 Sep 2014 12:14:22 AM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define lpos (pos << 1)
18 #define rpos (pos << 1|1)
19 #define getmid(l,r) (l + (r - l) / 2)
20 typedef long long ll;
21 const int INF = 1e9 + 10;
22 
23 int n;
24 int d[2010][2010];
25 int vis[2010];
26 
27 struct node{
28     int pre;
29     int id;
30 }no[2010];
31 
32 int main(){
33     scanf("%d",&n);
34     for(int i = 1; i <= n; ++i){
35         for(int j = 1; j <= n; ++j){
36             scanf("%d",&d[i][j]);
37         }
38     }
39     int flag = 1,zero;
40     for(int i = 1; flag && i <= n; ++i){
41         if(d[i][i] != 0){
42             flag = 0;
43             break;
44         }
45         zero = 0;
46         for(int j = i + 1; j <= n; ++j){
47             if(!d[i][j]) zero = 1;
48             if(d[i][j] != d[j][i]){
49                 flag = 0;
50                 break;
51             }
52         }
53         if(zero){
54             flag = 0;
55             break;
56         }
57     }
58     if(flag == 0) printf("NO\n");
59     else{
60         for(int i = 1; flag && i <= n; ++i){
61             int pos,tmin = INF;
62             for(int j = 1; j <= n; ++j) if(i != j){
63                 if(d[i][j] < tmin) tmin = d[i][j],pos = j;
64             }
65             for(int j = 1; j <= n; ++j) if(j != i && j != pos){
66                 if(abs(d[pos][j] - d[i][j]) != tmin){
67                     flag = 0;
68                     break;
69                 }
70             }
71         }
72         if(flag) printf("YES\n");
73         else printf("NO\n");
74     }
75     return 0;
76 }

 

posted @ 2014-09-29 17:15  Naturain  阅读(108)  评论(0)    收藏  举报