[CCF2015.12]题解

201512-1 数位之和

水题一个,取模除以10胡搞即可(不知道字符串为什么不行

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19
20 using namespace std;
21
22 int n;
23
24 int main() {
25     while(~scanf("%d", &n)) {
26         int ans = 0;
27         while(n) {
28             ans += n % 10;
29             n /= 10;
30         }
31         printf("%d\n", ans);
32     }
33     return 0;
34 }

1

201512-2 消除类游戏

按行按列枚举三个相邻的中点,看看左右是否和它相同颜色,如果相同就打标记,最后根据标记处理所有点。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19
20 using namespace std;
21
22 const int maxn = 33;
23 const int dx[4] = {0, 0, -1, 1};
24 const int dy[4] = {1, -1, 0, 0};
25 int n, m;
26 int G[maxn][maxn];
27 bool dis[maxn][maxn];
28
29 bool ok(int i, int j) {
30     return i >= 0 && j >= 0 && i < n && j < m;
31 }
32
33 int main() {
34     // freopen("in", "r", stdin);
35     while(~scanf("%d %d", &n, &m)) {
36         memset(dis, 0, sizeof(dis));
37         for(int i = 0; i < n; i++) {
38             for(int j = 0; j < m; j++) {
39                 scanf("%d", &G[i][j]);
40             }
41         }
42         for(int i = 0; i < n; i++) {
43             for(int j = 0; j < m; j++) {
44                 if(ok(i-1, j) && ok(i+1, j)) {
45                     if(G[i-1][j] == G[i+1][j] && G[i-1][j] == G[i][j] && G[i+1][j] == G[i][j]) {
46                         dis[i-1][j] = dis[i+1][j] = dis[i][j] = 1;
47                     }
48                 }
49             }
50         }
51         for(int i = 0; i < n; i++) {
52             for(int j = 0; j < m; j++) {
53                 if(ok(i, j-1) && ok(i, j+1)) {
54                     if(G[i][j-1] == G[i][j+1] && G[i][j-1] == G[i][j] && G[i][j+1] == G[i][j]) {
55                         dis[i][j-1] = dis[i][j+1] = dis[i][j] = 1;
56                     }
57                 }
58             }
59         }
60         for(int i = 0; i < n; i++) {
61             for(int j = 0; j < m; j++) {
62                 if(dis[i][j]) G[i][j] = 0;
63                 printf("%d ", G[i][j]);
64             }
65             printf("\n");
66         }
67     }
68     return 0;
69 }

2

201512-3 画图

小模拟,注意好行和列即可,第一个样例提供了一个trick,那就是覆盖后的颜色还可以被继续覆盖,并且覆盖后可以在其上画线段。判断线段相交在每画一段的时候完成,假如画之前存在与它不一样方向的线段就变+(注意原本就是+的情况)。填充操作一遍dfs就行,和POJ的一个题一样。

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <iomanip>
  4 #include <cstring>
  5 #include <climits>
  6 #include <complex>
  7 #include <fstream>
  8 #include <cassert>
  9 #include <cstdio>
 10 #include <bitset>
 11 #include <vector>
 12 #include <deque>
 13 #include <queue>
 14 #include <stack>
 15 #include <ctime>
 16 #include <set>
 17 #include <map>
 18 #include <cmath>
 19
 20 using namespace std;
 21
 22 typedef struct Point {
 23     int x, y;
 24     Point() {}
 25     Point(int xx, int yy) : x(xx), y(yy) {}
 26 }Point;
 27
 28 const int maxn = 111;
 29 const int dx[4] = {0, 0, 1, -1};
 30 const int dy[4] = {1, -1, 0, 0};
 31
 32 char G[maxn][maxn];
 33 int n, m, q;
 34 Point a, b;
 35 int cmd;
 36
 37 void init() {
 38     memset(G, 0, sizeof(G));
 39     for(int i = 0; i < n; i++) {
 40         for(int j = 0; j < m; j++) {
 41             G[i][j] = ‘.‘;
 42         }
 43     }
 44 }
 45
 46 void line(Point a, Point b) {
 47     if(a.y == b.y) {
 48         if(a.x > b.x) {
 49             Point tmp = a;
 50             a = b;
 51             b = tmp;
 52         }
 53         for(int i = a.x; i <= b.x; i++) {
 54             if(G[i][a.y] == ‘-‘ || G[i][a.y] == ‘+‘) G[i][a.y] = ‘+‘;
 55             else G[i][a.y] = ‘|‘;
 56         }
 57     }
 58     else if(a.x == b.x) {
 59         if(a.y > b.y) {
 60             Point tmp = a;
 61             a = b;
 62             b = tmp;
 63         }
 64         for(int i = a.y; i <= b.y; i++) {
 65             if(G[a.x][i] == ‘|‘ || G[a.x][i] == ‘+‘) G[a.x][i] = ‘+‘;
 66             else G[a.x][i] = ‘-‘;
 67         }
 68     }
 69 }
 70 bool ok(int i, int j) {
 71     return i >= 0 && j >= 0 && i < n && j < m;
 72 }
 73
 74 void dfs(int x, int y, char s) {
 75     for(int i = 0; i < 4; i++) {
 76         int xx = x + dx[i];
 77         int yy = y + dy[i];
 78         if(ok(xx, yy) && !(G[xx][yy] == ‘|‘ || G[xx][yy] == ‘+‘ || G[xx][yy] == ‘-‘ ) && G[xx][yy] != s) {
 79             G[xx][yy] = s;
 80             dfs(xx, yy, s);
 81         }
 82     }
 83 }
 84
 85 int main() {
 86     // freopen("in", "r", stdin);
 87     while(~scanf("%d %d", &m, &n)) {
 88         scanf("%d", &q);
 89         init();
 90         while(q--) {
 91             scanf("%d", &cmd);
 92             if(cmd == 0) {
 93                 scanf("%d %d %d %d", &a.y, &a.x, &b.y, &b.x);
 94                 line(a, b);
 95             }
 96             else {
 97                 char s[3];
 98                 memset(s, 0, sizeof(s));
 99                 scanf("%d %d", &a.y, &a.x);
100                 scanf("%s", s);
101                 dfs(a.x, a.y, s[0]);
102             }
103         }
104         for(int i = n - 1; i >= 0; i--) {
105             for(int j = 0; j < m; j++) {
106                 printf("%c", G[i][j]);
107             }
108             printf("\n");
109         }
110     }
111     return 0;
112 }

3

201512-4 送货

图论小题,求一条不用回到原点的欧拉路,trick在图不连通的情况,因此要提前做一步连通性的判断。还有就是记录点的度,假如是奇数度的点为0个或者2个的时候是存在这样一条路的,假如奇数度点为1或者大于2则不存在。dfs的时候打好标记就可以了。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19
20 using namespace std;
21
22 const int maxn = 10005;
23 const int maxm = 100005;
24 vector<int>::iterator it;
25 vector<int> G[maxn];
26 bool vis[maxn][maxn];
27 int dig[maxn];
28 int n, m, top;
29 int st[maxm];
30 int pre[maxn];
31
32 int find(int x) {
33     return x == pre[x] ? x : pre[x] = find(pre[x]);
34 }
35
36 void unite(int x, int y) {
37     x = find(x);
38     y = find(y);
39     if(x != y) {
40         pre[y] = x;
41     }
42 }
43 inline void init() {
44     for(int i = 0; i < maxn; i++) {
45         pre[i] = i;
46     }
47 }
48
49 void dfs(int u) {
50     for(int i = 0; i < G[u].size(); i++) {
51         if(!vis[u][G[u][i]]) {
52             vis[u][G[u][i]] = vis[G[u][i]][u] = 1;
53             dfs(G[u][i]);
54             st[top++] = G[u][i];
55         }
56     }
57 }
58
59 int main() {
60     // freopen("in", "r", stdin);
61     int a, b;
62     while(~scanf("%d %d", &n, &m)) {
63         init();
64         memset(dig, 0, sizeof(dig));
65         memset(vis, 0, sizeof(vis));
66         for(int i = 0; i < n + 5; i++) G[i].clear();
67         for(int i = 0; i < m; i++) {
68             scanf("%d %d", &a, &b);
69             G[a].push_back(b);
70             G[b].push_back(a);
71             unite(a, b);
72             dig[a]++; dig[b]++;
73         }
74         int odd = 0;
75         bool exflag = 0;
76         int father = find(1);
77         for(int i = 1; i <= n; i++) {
78             if(father != find(i)) exflag = 1;
79             sort(G[i].begin(), G[i].end());
80             if(dig[i] & 1) odd++;
81         }
82         if(odd == 1 || odd > 2 || exflag) {
83             puts("-1");
84             continue;
85         }
86         top = 0;
87         dfs(1);
88         printf("1");
89         while(top--) printf(" %d", st[top]);
90         printf("\n");
91     }
92     return 0;
93 }

4

201512-5 矩阵

题目好长QAQ,不想做QAQ

看了一眼题应该是矩阵快速幂,怎么看怎么是个烂题。。

时间: 2024-10-06 04:47:37

[CCF2015.12]题解的相关文章

cojs 强连通图计数1-2 题解报告

OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一改就可以了 首先我们考虑不合法的方案强连通分量缩点后一定是DAG 考虑子问题:DAG计数 做法可以参考<cojs DAG计数1-4 题解报告> 这里给出转移方程 f(n)=sigma((-1)^(k-1)*C(n,k)*2^(k*(n-k))*f(n-k)) 如果考虑上强连通分量缩点的情况呢? 我

[CCF2015.09]题解(待填

201509-1 数列分段 水,记下前一个数,看看跟当前是否一样,不一样就ans+1 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <casse

2017 acm icpc 沈阳(网络赛)5/12 题解

比赛中较...能做的5道题 hdoj6195. cable cable cable 题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6195 题目大意 : 略 规律 : 答案 = k+(m-k)*k hdoj6198. number number number 题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6198 题目大意  : 给你一个整数n.问你n个斐波那契数(可重复)不能构成哪些数,输出

CCF2015.12.2消除类游戏

问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除.当有多处可以被消除时,这些地方的棋子将同时被消除. 现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘. 请注意:一个棋子可能在某一行和某一列同时被消除. 输入格式 输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数. 接下来n行,每行m个

模拟12 题解

A. 斐波那契(fibonacci) 首先想到a,b<=1e6的暴力:建树,直接向上标记求lca. 建树的过程中发现一个性质. 斐波那契第n代兔子,是n-2代及以前的兔子的儿子. 因为编号连续且与父亲编号大小有关, 设该节点的编号为$x$,在第$k$代, 则$f(x)=x-fib(k-1)$. 二分查找父亲,向上标记求lca即可. (特判不换行,爆零两行泪) (见代码第25行) 1 #include<iostream> 2 #include<cstdio> 3 #define

2019.10.12题解

A. 木板 标签: 素因数的根号筛法 题解: 由相似三角形可得: $ ans=8*\sum_{i=1}^{n-1}[i*i(mod)n==0] $ 根号筛出质因子即可 B. 打扫卫生 标签: Dp+链表 正解: 暴力可A的一道题,但是正解其实并不难想 最暴力的Dp式子:$ f[i]=min{f[j]+cnt(j+1,i)^2} $ 假如j从i-1枚举,那么我们发现当cnt数到了sqrt(f[i])以上后对答案一定没有贡献 考虑用一个链表维护每个数截至到i出现的最后位置以保证复杂度$ O(nsqr

FR #12题解

A. 我的做法是nmlogn的....直接做m次堆贪心就可以.按理说是能过的... 正解直接是在原dp上搞一搞...可以做到n^2+nlog? 2333 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxn 2050 using namespace std; long long n,m,a[max

省选模拟12 题解

A. Colorado Potato Beetle 暴力做法是直接bfs. 优化的方法是离散化. 将特殊的点的横纵坐标抽出来,然后用这些横纵坐标为1e12*1e12分成一个个块,容易发现每个块内的状态是一致的. 然后用与暴力类似的方法即可,注意最后统计的是每个块的实际大小. B. Distinct Paths 观察可知数据范围欺骗了你. 似乎剪枝(注意去重复状态)的搜索就能过. 一个更合理的做法是因为行是单调不降的,状压每个颜色的最早出现的列就好了. 但是还是需要一些玄学剪枝. C. 回忆树 容

bzoj1588 营业额统计 题解--Treap

Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营业情况是一项相当复杂的工作.由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题.经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大