第八届蓝桥杯决赛小结
2017-05-29 19:14
246 查看
啊啊啊,我是个zz,果然拼图题是我的魔咒,三年蓝桥杯,次次出拼图,从来没做对过。
所以这次也炸了,一道填空题,四十来分,没了。所以特等什么的也飞了,凄凉,本想
和队友复制一波去年理工的故事的,然并卵。跪倒Orz
顺道说一下今年的C/C++B组题目吧,感觉和以前比的确要容易了好多。
第一题是个zz,输出36进制下的MANY值是多少,随便算。
答案应该是:1040254
第二题就是日了狗的拼图题,我dfs下去忘了去重啦T_T
答案应该是:101466
第三题代码填空,找找规律,就能发现,是个简单题。
答案应该是:m+1-y
第四题求一棵树加一条边以后形成的环上的点,排序输出
用并查集找出多的那条边,dfs确定深度,然后把点找出来排序。参考代码
#include<map> #include<set> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; #define ms(x,y) memset(x,y,sizeof(x)) #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) #define loop(i,j,k) for (int i=j;i!=-1;i=k[i]) #define inone(x) scanf("%d",&x) #define intwo(x,y) scanf("%d%d",&x,&y) #define inthr(x,y,z) scanf("%d%d%d",&x,&y,&z) #define infou(x,y,z,p) scanf("%d%d%d%d",&x,&y,&z,&p) #define lson x<<1,l,mid #define rson x<<1|1,mid+1,r #define mp(i,j) make_pair(i,j) #define ff first #define ss second typedef long long LL; typedef pair<int, int> pii; const int low(int x) { return x&-x; } const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 2e5 + 10; const int M = 1e5; const double eps = 1e-6; int n, x, y; int fa , dep , s, t; int ft , u , nt , sz; int ans , cnt; int get(int x) { return x == fa[x] ? x : fa[x] = get(fa[x]); } void add(int x, int y) { u[sz] = y; nt[sz] = ft[x]; ft[x] = sz++; u[sz] = x; nt[sz] = ft[y]; ft[y] = sz++; } void dfs(int x, int f) { fa[x] = f; dep[x] = dep[f] + 1; loop(i, ft[x], nt) { if (u[i] == f) continue; dfs(u[i], x); } } int main() { inone(n); cnt = sz = 0; rep(i, 1, n) ft[i] = -1, fa[i] = i; rep(i, 1, n) { intwo(x, y); int fx = get(x), fy = get(y); if (fx == fy) s = x, t = y; else fa[fx] = fy, add(x, y); } dep[0] = 0; dfs(1, 0); while (s != t) { if (dep[s] > dep[t]) swap(s, t); ans[cnt++] = t; t = fa[t]; } ans[cnt++] = t; sort(ans, ans + cnt); rep(i, 0, cnt - 1) { printf("%d%s", ans[i], i == cnt - 1 ? "\n" : " "); } return 0; }第五题给n个数字,求最多取出几个可以是任意两个数的差不为k
按差是否为0区分,如果差是0,那么答案是不同数字个数,不然,按照给出的值对于差的余数分类。
不同类中做简单的动态规划即可,参考代码如下。
#include<map> #include<set> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; #define ms(x,y) memset(x,y,sizeof(x)) #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) #define loop(i,j,k) for (int i=j;i!=-1;i=k[i]) #define inone(x) scanf("%d",&x) #define intwo(x,y) scanf("%d%d",&x,&y) #define inthr(x,y,z) scanf("%d%d%d",&x,&y,&z) #define infou(x,y,z,p) scanf("%d%d%d%d",&x,&y,&z,&p) #define lson x<<1,l,mid #define rson x<<1|1,mid+1,r #define mp(i,j) make_pair(i,j) #define ff first #define ss second typedef long long LL; typedef pair<int, int> pii; const int low(int x) { return x&-x; } const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 1e5 + 10; const int M = 1e5; const double eps = 1e-6; int n, m, a , b , c ; int main() { intwo(n, m); rep(i, 0, n - 1) inone(a[i]), b[a[i]]++; int ans = 0; if (m == 0) { sort(a, a + n); ans = unique(a, a + n) - a; } else { for (int i = 0; i < m; i++) { int res = 0; for (int j = i; j < N; j += m) { c[j] = b[j]; if (j >= m) c[j] = max(c[j], c[j - m]); if (j >= m + m) c[j] = max(c[j], c[j - m - m] + b[j]); res = max(res, c[j]); } ans += res; } } printf("%d\n", ans); return 0; }
然后是最后一题,给出一个n个点,m条边的无向图,保证每个点最少有两个度,走过的边不能立刻回头走,问每个点出发回到自身的期望步数。
这个题想不出什么好的办法,只能暴力模拟操作了,对于大数据,可能超时,可能会炸精度,这个咱就不清楚了。参考代码
#include<map> #include<set> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; #define ms(x,y) memset(x,y,sizeof(x)) #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) #define loop(i,j,k) for (int i=j;i!=-1;i=k[i]) #define inone(x) scanf("%d",&x) #define intwo(x,y) scanf("%d%d",&x,&y) #define inthr(x,y,z) scanf("%d%d%d",&x,&y,&z) #define infou(x,y,z,p) scanf("%d%d%d%d",&x,&y,&z,&p) #define lson x<<1,l,mid #define rson x<<1|1,mid+1,r #define mp(i,j) make_pair(i,j) #define ff first #define ss second typedef long long LL; typedef pair<int, int> pii; const int low(int x) { return x&-x; } const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 30; const int M = 1e5; const double eps = 1e-15; int n, m, x, y; int d , cnt ; double p , g ; int main() { intwo(n, m); rep(i, 1, m) { intwo(x, y); d[x][y] = d[y][x] = 1; cnt[x]++; cnt[y]++; } rep(s, 1, n) { ms(p, 0); double ans = 1; rep(t, 1, n) if (d[s][t]) p[s][t] = 1.0 / cnt[s]; while (true) { bool flag = true; rep(i, 1, n) rep(j, 1, n) g[i][j] = 0; rep(i, 1, n) rep(j, 1, n) { if (!d[i][j] || p[i][j] < eps) continue; flag = false; rep(k, 1, n) { if (i == k || !d[j][k]) continue; g[j][k] += p[i][j] * 1.0 / (cnt[j] - 1); } } if (flag) break; rep(i, 1, n) rep(j, 1, n) { ans += g[i][j]; if (j == s) g[i][j] = 0; p[i][j] = g[i][j]; } } printf("%.12lf\n", ans); } return 0; }
相关文章推荐
- 2017第八届蓝桥杯决赛_希尔伯特曲线
- 2017第八届蓝桥杯决赛_发现环
- 2017第八届蓝桥杯决赛_对局匹配
- 第八届蓝桥杯决赛体会
- 第八届蓝桥杯决赛 对局匹配
- 2017第八届蓝桥杯决赛_观光旅游
- 第八届蓝桥杯C语言B组决赛 对局匹配
- 第八届蓝桥杯决赛发现环--并查集+DFS
- 第八届蓝桥杯C语言B组,小结
- 2017第八届蓝桥杯决赛(大学B组)试题
- 2017年第八届蓝桥杯C/C++B组决赛题解
- 第八届蓝桥杯决赛 发现环(无向图找环 tarjan)
- 第八届蓝桥杯决赛感想
- 第六届蓝桥杯决赛试题-机器人繁殖
- 蓝桥杯决赛愤怒的小鸟
- 第八届蓝桥杯C++B组 包子凑数
- 2017第八届蓝桥杯省赛-大学A组 方格分割(深搜dfs)
- 17年第八届蓝桥杯 c/c++ b组 题解
- 蓝桥杯java第八届B组:分巧克力
- 凑平方数 第七届蓝桥杯决赛javaA组