第八届蓝桥杯决赛小结

啊啊啊,我是个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[N], dep[N], s, t;
int ft[N], u[N], nt[N], sz;
int ans[N], 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[N], b[N], c[N];

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[N][N], cnt[N];
double p[N][N], g[N][N];

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值