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 }
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
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 }
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 }

浙公网安备 33010602011771号