您的位置:首页 > 其它

第八届蓝桥杯决赛小结

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: