第十四届蓝桥杯C++B组题解(不完全对)

2023-11-05

A直接暴力枚举 答案235

#include<bits/stdc++.h>
#define int long long
#define db double
#define PII pair<int,int >
#define fi first
#define se second

using namespace std;

int va[200] = {0,5,6,8,6,9,1,6,1,2,4,9,1,9,8,2,3,6,4,7,7,5,9,5,0,3,8,7,5,8,1,5,8,6,1,8,3,0,3,7,9,2,
7,0,5,8,8,5,7,0,9,9,1,9,4,4,6,8,6,3,3,8,5,1,6,3,4,6,7,0,7,8,2,7,6,8,9,5,6,5,6,1,4,0,1,
0,0,9,4,8,0,9,1,2,8,5,0,2,5,3,3};

int vb[50] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

signed main()
{
	set<string> v;
	int n = 100;
	for(int y1=1;y1<=n;y1++)
	{
		if(va[y1]!=2) continue;
		for(int y2=y1+1;y2<=n;y2++)
		{
			if(va[y2]!=0) continue;
			for(int y3=y2+1;y3<=n;y3++)
			{
				if(va[y3]!=2) continue;
				for(int y4=y3+1;y4<=n;y4++)
				{
					if(va[y4]!=3) continue;
					for(int m1=y4+1;m1<=n;m1++)
					{
						for(int m2=m1+1;m2<=n;m2++)
						{
							for(int m3=m2+1;m3<=n;m3++)
							{
								for(int m4=m3+1;m4<=n;m4++)
								{
									int x1 = va[m1],x2 = va[m2],d1 = va[m3],d2 = va[m4];
									int mm = x1*10+x2,dd = d1*10+d2;
									if(mm<=12&&mm>=1&&dd>=1&&dd<=vb[mm])
									{
										char a = x1+'0',b = x2+'0',c = d1+'0',d = d2+'0';
										string s;
										s += a;s += b;s += c;s += d;
										v.insert(s);
									}
								}
							}
						}
					}
				}
			}
		}
	}
	cout<<v.size();
	for(auto t:v) cout<<t<<"\n";
}

B枚举0的个数,公式求一下。 11027421
代码比完忘记保存了

C思维

#include<bits/stdc++.h>
#define int long long
#define db double

using namespace std;

const int N = 2e5+10;

int n;
int va[N],vb[N];

signed main()
{
	scanf("%lld",&n);
	int anwl = 0,anwr = 2e9;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld %lld",&va[i],&vb[i]);
		int l = va[i]/(vb[i]+1)+1;
		int r = va[i]/vb[i];
		anwl = max(anwl,l);
		anwr = min(anwr,r);
	}
	printf("%lld %lld",anwl,anwr);
	return 0;
}

D搜索+剪纸优化

#include<bits/stdc++.h>
#define int long long
#define db double

using namespace std;

const int N = 100;

struct Node{
	int a,b,c;
}va[N];

int T,n;
int vis[N];
int sta[50000];
int suc = 0;

void dfs(int now,int tim,int sum,int res)
{
	if(suc) return ;
	if(sta[res]==-1) return ;
	if(sum==n)
	{
		suc = 1;
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i]) continue;
		if(va[i].b<tim)
		{
			sta[res] = -1;
			return ;
		}
		vis[i] = 1;
		dfs(i,tim+va[i].c,sum+1,res+(1ll<<i));
		vis[i] = 0;
	}
}

signed main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld",&n);
		suc = 0;
		for(int i=1;i<=n;i++) vis[i] = 0;
		for(int i=0;i<=(1ll<<n);i++) sta[i] = 0;
		for(int i=1;i<=n;i++)
		{
			int a,b,c;
			scanf("%lld%lld%lld",&a,&b,&c);
			va[i] = {a,a+b,c};
		}
		for(int i=1;i<=n;i++)
		{
			vis[i] = 1;
			dfs(i,0+va[i].c,1,(1ll<<i));
			vis[i] = 0;
		}
		if(suc) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

E动态规划,定义dp[i][j]为用到第i个,结尾为j最少要删多少个

#include<bits/stdc++.h>
#define int long long
#define db double
#define PII pair<int,int >
#define fi first
#define se second

using namespace std;

const int N = 1e5+10;

int n,m;
int va[N];
int l[N],r[N];
int dp[N][10];

int get(int x)
{
	while(x)
	{
		if(x<10) return x;
		x /= 10;
	}
}

signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>va[i];
		l[i] = get(va[i]),r[i] = va[i]%10;
	}
	for(int i=1;i<=n;i++) for(int j=0;j<=9;j++) dp[i][j] = 1e9;
	for(int i=0;i<=9;i++)
	{
		if(i==r[1]) dp[1][i] = 0;
		else dp[1][i] = 1;
	}
	for(int i=2;i<=n;i++)
	{
		for(int j=0;j<=9;j++)
		{
			if(j==r[i]) dp[i][j] = min(dp[i][j],dp[i-1][l[i]]);
			dp[i][j] = min(dp[i][j],dp[i-1][j]+1);
		}
	}
	int minn = 1e9;
	for(int i=0;i<=9;i++) minn = min(minn,dp[n][i]);
	cout<<minn;
	return 0;
}

F dfs+bfs

 #include<bits/stdc++.h>
#define int long long
#define db double
#define PII pair<int,int >
#define fi first
#define se second

using namespace std;

int T,n,m;
char va[55][55];
int vis[55][55];
int dx[8] = {1,-1,0,0,-1,-1,1,1};
int dy[8] = {0,0,1,-1,-1,1,-1,1};

bool dfs(int A,int B)
{
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		vis[i][j] = 0;
	}
	queue<PII > q;
	q.push({A,B});
	vis[A][B] = 1;
	while(q.size())
	{
		auto now = q.front();q.pop();
		int x = now.fi,y = now.se;
		for(int i=0;i<8;i++)
		{
			int xx = x+dx[i],yy = y+dy[i];
			if(xx<1||xx>n||yy<1||yy>m) return true;
			if(va[xx][yy]=='0'&&!vis[xx][yy])
			{
				vis[xx][yy] = 1;
				q.push({xx,yy});
			}
		}
	}
	return false;
}

void bfs(int A,int B)
{
	queue<PII > q;
	q.push({A,B});
	while(q.size())
	{
		auto now = q.front();q.pop();
		int x = now.fi,y = now.se;
		for(int i=0;i<4;i++)
		{
			int xx = x+dx[i],yy = y+dy[i];
			if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&va[xx][yy]=='1')
			{
				va[xx][yy] = '0';
				q.push({xx,yy});
			}
		}
	}
}

signed main()
{
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			cin>>va[i][j];
		}
		int ans = 0;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(va[i][j]=='1')
				{
					if(!dfs(i,j))
					va[i][j] = '0';
				}
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(va[i][j]=='1')
				{
					ans++;
					bfs(i,j);
				}
			}
		}
		cout<<ans;
		if(T!=0) cout<<"\n";
	}
	return 0;
}

G 维护一个后缀即可

 #include<bits/stdc++.h>
#define int long long
#define db double
#define PII pair<int,int >
#define fi first
#define se second

using namespace std;

const int N = 5e5+50;

int n,m;
char c1,c2;
char s[N];
int sumr[N];

signed main()
{
	cin>>m>>s+1>>c1>>c2;
	n = strlen(s+1);
	for(int i=n;i>=1;i--)
	{
		sumr[i] = sumr[i+1]+(s[i]==c2);
	}
	int ans = 0;
	for(int i=1;i<=n;i++)
	{
		if(s[i]==c1&&i+m-1<=n)
		ans += sumr[i+m-1];
	}
	cout<<ans;
	return 0;
}

H 记录左右位置是谁

#include<bits/stdc++.h>
#define int long long
#define db double
#define PII pair<int,int >
#define fi first
#define se second

using namespace std;

const int N = 5e5+10;

int n,m;
int va[N];
int vis[N];
int l[N],r[N];

signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>va[i];
	for(int i=1;i<=n;i++)
	{
		if(i==1) l[i] = -1,r[i] = i+1;
		else if(i==n) l[i] = i-1,r[i] = -1;
		else l[i] = i-1,r[i] = i+1;
	}
	while(m--)
	{
		int minn = 1e9,idx = 0;
		int now = 1;
		while(now!=-1)
		{
			if(vis[now]==1) now = r[now];
			else
			{
				if(minn>va[now])
				{
					minn = va[now];
					idx = now;
				}
				now = r[now];
			}
		}
		if(l[idx]!=-1) va[l[idx]] += va[idx];
		if(r[idx]!=-1) va[r[idx]] += va[idx];
		vis[idx] = 1;
		r[l[idx]] = r[idx];
		l[r[idx]] = l[idx];
	}
	int now = 1;
	while(now!=-1)
	{
		if(vis[now]==1) now = r[now];
		else
		{
			cout<<va[now]<<" ";
			now = r[now];
		}
	}
	return 0;
}

I LCA

 #include<bits/stdc++.h>
#define int long long
#define db double
#define PII pair<int,int >
#define fi first
#define se second
#define pb push_back

using namespace std;

const int N = 1e5+10;

int n,m;
int va[N];
int acc[N][25],cnt=22;
int dep[N],sum[N];

vector<PII > e[N];

void dfs(int now,int p)
{
	acc[now][0] = p;
	dep[now] = dep[p]+1;
	for(auto t:e[now])
	{
		int spot = t.fi,w = t.se;
		if(spot==p) continue;
		sum[spot] = sum[now]+w;
		dfs(spot,now);
	}
}

int lca(int a,int b)
{
	if(dep[a]<dep[b]) swap(a,b);
	for(int i=cnt;i>=0;i--)
	{
		if(dep[acc[a][i]]>=dep[b])
		a = acc[a][i];
	}
	if(a==b) return a;
	for(int i=cnt;i>=0;i--)
	{
		if(acc[a][i]!=acc[b][i])
		{
			a = acc[a][i];
			b = acc[b][i];
		}
	}
	return acc[a][0];
}

int get(int a,int b)
{
	int res = sum[a]+sum[b]-2*sum[lca(a,b)];
	return res;
}

signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<n;i++)
	{
		int a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		e[a].pb({b,c});
		e[b].pb({a,c});
	}
	dfs(1,0);
	for(int i=1;i<=cnt;i++)
	{
		for(int j=1;j<=n;j++)
		acc[j][i] = acc[acc[j][i-1]][i-1];
	}
	for(int i=1;i<=m;i++) scanf("%lld",&va[i]);
	int ans = 0;
	for(int i=1;i<m;i++) ans += get(va[i],va[i+1]);
	for(int i=1;i<=m;i++)
	{
		int res = 0;
		if(i==1) res = ans-get(va[i],va[i+1]);
		else if(i==m) res = ans-get(va[i],va[i-1]);
		else
		{
			res = ans-get(va[i],va[i-1])-get(va[i],va[i+1]);
			res += get(va[i-1],va[i+1]);
		}
		printf("%lld",res);
		if(i!=m) printf(" ");
	}
	return 0;
}

J 数据小的时候暴力枚举选择哪一天边可以,数据大直接-1

#include<bits/stdc++.h>
#define int long long
#define db double
#define PII pair<int,int >
#define fi first
#define se second

using namespace std;

const int N = 2e5+10;

int n,m;
PII va[N];
PII vb[N];
int acc[N];

int find(int x)
{
	if(x!=acc[x]) acc[x] = find(acc[x]);
	return acc[x];
}

bool check(int x)
{
	for(int i=1;i<=n;i++) acc[i] = i;
	for(int i=1;i<n;i++)
	{
		if(i==x) continue;
		int a = va[i].fi,b = va[i].se;
		int t1 = find(a),t2 = find(b);
		acc[t1] = t2;
	}
	for(int i=1;i<=m;i++)
	{
		int a = vb[i].fi,b = vb[i].se;
		int t1 = find(a),t2 = find(b);
		if(t1==t2) return false;
	}
	return true;
}

signed main()
{
	cin>>n>>m;
	for(int i=1;i<n;i++) cin>>va[i].fi>>va[i].se;
	for(int i=1;i<=m;i++) cin>>vb[i].fi>>vb[i].se;
	if(n*m>3e7||n*n>3e7)
	{
		cout<<-1;
		return 0;
	}
	for(int i=n-1;i>=1;i--)
	{
		if(check(i))
		{
			cout<<i;
			return 0;
		}
	}
	cout<<-1;
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十四届蓝桥杯C++B组题解(不完全对) 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐