2023第十四届蓝桥杯 C/C++大学生A组省赛 满分题解

2023-11-12

写在前面

以下代码,目前均可通过民间OJ数据(dotcpp & New Online Judge),

两个OJ题目互补,能构成全集,可以到对应链接下搜题提交(感谢OJ对题目的支持)

如果发现任何问题,包含但不限于算法思路出错、OJ数据弱算法实际超时、存在没考虑到的边界情况等,请及时联系作者

e6776398414e412199c43c9775dc086d.png

dadf3bb6f9044639ab96157a3dceeb25.png

更新(2023年5月14日)

洛谷更新了蓝桥杯2023年的题目,A组题号P9230-P9238

于是,把题目又都交了一遍,倒数第二题像素放置直接爆搜超时,

60个点TLE了8个点,加了个bitset记忆化就过了,代码已更新

题解

A.幸运数(模拟)

题面

caec59f883fa4483947d5498fb767ae7.png

题解 

由于是填空题,按题意本地暴力,几秒就跑出来结果了,直接交结果

代码

#include<bits/stdc++.h>
using namespace std;
int ans;
int main(){
	/*
	for(int i=1;i<=100000000;++i){
		int cnt=0;
		for(int j=i;j;j/=10)cnt++;
		if(cnt&1)continue;
		int sum=0,now=0;
		for(int j=i;j;j/=10){
			now++;
			if(now<=cnt/2)sum+=j%10;
			else sum-=j%10;
		}
		if(!sum)ans++;
	}
	printf("%d\n",ans);
	*/
	puts("4430091");
	return 0;
}

B.有奖问答(搜索/dp)

题面

e7a9ee7d17b74f6085a71303a327bbe6.png

题解

1. 搜索:2的30次方种可能,每次要么+10要么清零,遇到100分时,直接return,几秒跑出来结果后,直接交结果

2. dp:dp[i][j]表示前i轮过后分数为j的方案数,注意中间可以随时停止

代码(dp)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[31][101],ans;
int main(){
	dp[0][0]=1;
	for(int i=0;i<30;++i){
		for(int j=0;j<100;j+=10){
			if(!dp[i][j])continue;
			if(j<90)dp[i+1][j+10]+=dp[i][j];
			dp[i+1][0]+=dp[i][j];
		}
		ans+=dp[i+1][70];
	}
	printf("%lld\n",ans);
	//puts("8335366");
	return 0;
}

C.平方差(构造/规律)

题面

8eb8e16f67214fae927127238dd5bec6.png

题解

打表或构造发现,形如4k+2的数无法被表示,

统计[l,r]的答案,前缀和作差,转化为[1,r]的答案减去[1,l-1]的答案

而[1,x]中,形如4k+2的数的个数为(x+2)/4

证明的话,x=(y+z)(y-z),注意到y+z和y-z同奇偶,

1. y+z为奇数时,x为奇数;y+z为偶数时,x为4的倍数,这表明4k+2无法被取到

2. gif.latex?2k&plus;1%3D%28k&plus;1%29%5E2-k%5E2​,gif.latex?4k%3D%28k&plus;1%29%5E2-%28k-1%29%5E2​,这表明奇数和4的倍数均能被取到

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500;
bool vis[N];
int l,r;
int cal(int x){
	return x-(x+2)/4;
}
int main(){
	/*
	for(int i=0;i<=50;++i){
		for(int j=0;j<=i;++j){
			int v=i*i-j*j;
			if(v>=0 && v<N)vis[v]=1;
		}
	}
	for(int i=0;i<=100;++i){
		if(!vis[i])printf("i:%d\n",i);
	}*/
	scanf("%d%d",&l,&r);
	printf("%d\n",cal(r)-cal(l-1));
	return 0;
}
//x=(y+z)(y-z)
//2k+1=(k+1)^2-k^2
//4k=(k+1)^2-(k-1)^2

D.更小的数(区间dp)

题面

82a9c62506d54fd59e6605db7e56ce5e.png

935de08a9a484ee0ac5f8e72dffbeaf0.png

题解

未反转的段仍相同不用关注,只需关注反转的段,

记反转前的串为old(即num串),之后的串为new

运用递归/记忆化搜索的思想,有以下几种情况

1. 当i=j时,new[i,j]不小于old[i,j]

2. 当i+1=j时,new[i,j]小于old[i,j],当且仅当new[i]<old[i],即num[j]<num[i]

3. 否则,

①若num[j]<num[i],new[i,j]一定小于old[i,j]

②若num[j]=num[i],则可以去掉这两个字母,只需比较new[i+1,j-1]和old[i+1,j-1]

③若num[j]>num[i],new[i,j]一定大于old[i,j]

从短串递推到长串,就是区间dp了,当然直接写记忆化搜索也行

代码中,dp[i][j]=1表示反转后更小,=0表示反转后大于等于原来

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e3+10;
int n,dp[N][N],ans;
char s[N];
int main(){
	scanf("%s",s);
	n=strlen(s);
	for(int len=2;len<=n;++len){
		for(int l=0;l+len-1<n;++l){
			int r=l+len-1;
			if(s[l]>s[r])dp[l][r]=1;
			else if(s[l]==s[r])dp[l][r]=dp[l+1][r-1];
			ans+=(dp[l][r]==1);
		}
	}
	printf("%d\n",ans);
	return 0;
}
//4321
//1234

E.更小的数(树上莫队/启发式合并)

题面

20ff774db5ec439d8ebe4d0e773159f5.png

题解

1. 树上莫队:

树上莫队=莫队+dfs序

建树后求dfs序,每个子树对应的dfs区间就是一个询问区间,将询问区间排序后套用莫队,

维护当前颜色i出现的次数now[i]、出现次数为i的颜色种类数freq[i]

任取区间内出现的一种颜色x,若now[x]*freq[now[x]]=区间长度则合法,否则不合法

复杂度O(nsqrt(n))

2. 启发式合并:

可以维护相同的东西,只是套了个启发式合并的壳

重儿子直接继承当前维护的信息,把轻儿子维护的信息往重儿子上合并,

由于每个点至多出现在log个轻儿子所在的子树里,复杂度O(nlogn)

代码(树上莫队)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int n,m,c[N],f,in[N],out[N],tot,id[N],pos[N],sz;
int now[N],freq[N],ans;
map<int,int>vis;
vector<int>e[N];
struct node{
	int l,r;
}q[N];
void add(int col,int v){
	freq[now[col]]--;
	now[col]+=v;
	freq[now[col]]++;
}
bool operator<(node a,node b){
	if(pos[a.l]==pos[b.l]){
		if(pos[a.l]&1)return a.r>b.r;
		else return a.r<b.r;
	}
	return a.l<b.l;
}
void dfs(int u){
	in[u]=++tot;
	id[tot]=u;
	for(auto &v:e[u]){
		dfs(v);
	}
	out[u]=tot;
	q[++m]={in[u],out[u]};
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d%d",&c[i],&f);
		if(!vis.count(c[i])){
			vis[c[i]]=1;
			freq[0]++;
		}
		if(i>1)e[f].push_back(i);
	}
	dfs(1);
	sz=(int)sqrt(n);
	for(int i=1;i<=n;++i){
		pos[i]=1+(i-1)/sz;
	}
	sort(q+1,q+n+1);
	int l=1,r=1;
	add(c[1],1);
	for(int i=1;i<=n;++i){
		for(;r<q[i].r;r++)add(c[id[r+1]],1);
		for(;r>q[i].r;r--)add(c[id[r]],-1);
		for(;l<q[i].l;l++)add(c[id[l]],-1);
		for(;l>q[i].l;l--)add(c[id[l-1]],1);
		int col=c[id[l]],cnt=now[col],f=freq[cnt];
		if(f*cnt==r-l+1)ans++;
	}
	printf("%d\n",ans);
	return 0;
}
/*
6
2 0
2 1
1 2
3 3
3 4
1 4
*/

F.买瓜(折半枚举+三进制枚举/枚举子集的子集)

题面

b43382620fe148e89ff81f9ce5eede22.png

题解

每个西瓜三种选择:不选,选但不劈,选且劈两半

直接三进制枚举的话,3的30次方,复杂度爆炸

考虑拆成两半枚举(折半枚举,也叫meet-in-middle)

分别维护3的15次方大小的集合a、b,

答案只可能完全来自a、或者完全来自b、或者ab各一部分

ab各一部分的话,在枚举b集合内的元素对应的和为x时,到a集合内查元素和m-x是否存在

复杂度O(3^15*log(3^15))​,大概3e8多,时间1s(题面pdf),比较极限,难以通过(New Online Judge2s dotcpp3s),试了试unordered_map去卡2s也TLE了,而瓶颈主要在集合查的这个log,

所以手写哈希(开散列),将log这个常数再压一压,就可以通过2s的题了

256M空间其实也比较极限,哈希模数那个数组不要开太大(调小了TLE调大了MLE)

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
#define fi first
#define se second
const int N=32,M=1<<15,mod=19260817,S=14348907;
int n,bit[M];
int head[mod],nex[S],cnt;
P b[S];
ll m,a[N],f[M],g[M],sum;
inline void upd(int x,int v){
    int u=x%mod;
    for(int i=head[u];i;i=nex[i]){
        if(b[i].fi==x){
            b[i].se=min(b[i].se,v);
            return;
        }
    }
    b[++cnt]=P(x,v);
    nex[cnt]=head[u];
    head[u]=cnt;
}
inline int cal(int x){
    int u=x%mod;
    for(int i=head[u];i;i=nex[i]){
        if(b[i].fi==x)return b[i].se;
    }
    return N;
}
int sol(){
    if(sum==m)return 0;
    if(n==1){
        if(a[0]/2==m)return 1;
        return -1;
    }
    int ans=N;
    for(int i=1;i<M;++i){
        bit[i]=bit[i>>1]+(i&1);
    }
    int l=n/2,lb=1<<l,r=n-n/2,rb=1<<r;
    for(int i=0;i<l;++i){
        f[1<<i]=a[i];
    }
    for(int i=1;i<lb;++i){
        int x=i&-i;
        f[i]=f[x]+f[i^x];
        if((f[i]>>1)>m)continue;
        for(int j=i;;j=(j-1)&i){
            ll v=(f[j]>>1)+f[j^i];
            if(v<=m){
                if(v==m)ans=min(ans,bit[j]);
                else upd((int)v,bit[j]);
            }
            if(!j)break;
        }
    }
    for(int i=0;i<r;++i){
        g[1<<i]=a[l+i];
    }
    for(int i=1;i<rb;++i){
        int x=i&-i;
        g[i]=g[x]+g[i^x];
        if((g[i]>>1)>m)continue;
        for(int j=i;;j=(j-1)&i){
            ll v=(g[j]>>1)+g[j^i];
            if(v<=m){
                if(v==m)ans=min(ans,bit[j]);
                else ans=min(ans,cal((int)(m-v))+bit[j]);
            }
            if(!j)break;
        }
    }
    if(ans>n)ans=-1;
    return ans;
}
int main(){
    scanf("%d%lld",&n,&m);
    m*=2;
    for(int i=0;i<n;++i){
        scanf("%lld",&a[i]);
        a[i]*=2;
        sum+=a[i];
    }
    printf("%d\n",sol());
    return 0;
}

G.网络稳定性(kruskal重构树)

题目dc0d1cab46c6465796ae40cd3ffce60f.png

d994cfa3c38b4e6d97835bb138b3ab7f.png

题解

kruskal重构树裸题,

重构树听上去高端,实则就是在kruskal建最大生成树的过程中额外建点、赋权

比如,u和v当前不在一个集合里,通过w这条边合并时,

新开一个点x,令x是u和v的父亲,而x的权值为w,

查询时,查u和v的lca的权值即可,即为最大连通路径上的最小连通权值

因为按权值从大到小遍历,已经通过权值大的边,使得点之间尽可能连通了

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+10,M=3e5+10,K=20;
int n,m,q,u,v,par[N],a[N],f[N][K],dep[N];
bool vis[N];
vector<int>E[N];
struct edge{
	int u,v,w;
}e[M];
int find(int x){
	return par[x]==x?x:par[x]=find(par[x]);
}
bool cmp(edge a,edge b){
	return a.w>b.w;
}
void dfs(int u,int fa){
	vis[u]=1;
	f[u][0]=fa;
	dep[u]=dep[fa]+1;
	for(auto &v:E[u]){
		if(v==fa)continue;
		dfs(v,u);
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	int d=dep[u]-dep[v];
	for(int i=K-1;i>=0;--i){
		if(d>>i&1)u=f[u][i];
	}
	if(u==v)return u;
	for(int i=K-1;i>=0;--i){
		if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];
	}
	return f[u][0];
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n+m;++i){
		par[i]=i;
	}
	for(int i=1;i<=m;++i){
		scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	}
	sort(e+1,e+m+1,cmp);
	int cur=n;
	for(int i=1;i<=m;++i){
		int u=e[i].u,v=e[i].v,w=e[i].w;
		u=find(u),v=find(v);
		if(u==v)continue;
		++cur;
		par[u]=par[v]=cur;
		E[cur].push_back(u);
		E[cur].push_back(v);
		a[cur]=w;
	}
	for(int i=cur;i>=1;--i){
		if(!vis[i])dfs(i,0);
	}
	for(int j=1;j<K;++j){
		for(int i=1;i<=cur;++i){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	while(q--){
		scanf("%d%d",&u,&v);
		if(find(u)!=find(v)){
			puts("-1");
			continue;
		}
		printf("%d\n",a[lca(u,v)]);
	}
	return 0;
}
/*
5 4 3 
1 2 5
2 3 6
3 4 1
1 4 3
1 5
2 4
1 3
*/

H. 异或和之和(按位计算贡献)

题目

0e5f81b03a4349249b083a99395f19c8.png

题解

按每个二进制位i考虑,从而转化为0、1序列的问题

一个子段[l,r]在第i位有贡献,当且仅当[l,r]内第i位出现的次数为奇数次,

前缀和做差[l,r]=[1,r]减[1,l-1],所以维护当前有多少个前缀是奇数,有多少个前缀是偶数

[l,r]为奇数,若[1,r]为偶数则要求[1,l-1]为奇数,反之同理,

枚举每个右端点,统计与其对应的有贡献的左端点,计算答案

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,a[N],sum[2];
ll ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	for(int i=0;i<=20;++i){
		sum[0]=1,sum[1]=0;
		int now=0;
		ll all=0;
		for(int j=1;j<=n;++j){
			int v=a[j]>>i&1;
			now^=v;
			all+=sum[now^1];
			sum[now]++;
		}
		ans+=all*(1ll<<i);
	}
	printf("%lld\n",ans);
	return 0;
}
/*
5
1 2 3 4 5
*/

I. 像素放置(搜索)

题面

8f6b927be6c2417a9c707e98262a9510.png

题解

写状压的话感觉总难免需要关注三行的有效状态,

复杂度好像更没有办法保证,所以写了搜索剪枝,

总体思路还是枚举每一位填0还是填1,加入了校验机制,以及搜到解之后直接return

搜索剪枝也要用到插头dp(轮廓线dp)的思想,配合记忆化

洛谷的数据足够强,没加记忆化没过

直接的想法是dp[10][10][1<<22]

dp[i][j][k]表示当前搜到了(i,j)这个格子,而前面2m+2个格子的状态是k时,这个状态是否搜到过

由于搜到解后就返回答案,这么记录,只是为了避免重复搜无效的状态

由于直接int数组开不下,所以用bitset将空间压为1/32,bitset<M>dp[10][10]

 如左图,当(i,j)位于行初时,只需关注前2*m个格子;再往右一格时,只需关注前2*m+1个格子,

再往右两格及更右时,只需关注前2*m+2个格子,直至行尾,最多只需关注22个格子

对于行越界的情形,不妨认为上面有两行全0的空行

复杂度O(n*m*2^{2*m+2})

a[i][j]:原图转化过来的数字,下划线转成了INF

b[i][j]:当前填的答案数组

cur[i][j]:(i,j)本身及(i,j)周围一圈合法位置中,当前填了几个1

填一个数时,考虑它本身及周围一圈的合法位置(最多9个)

校验机制是:

1. 如果当前填了这个数,导致超过上限,即cur[i][j]>a[i][j],则不合法

2. 如果当前填的格子,是格子(i,j)管辖的最后一个格子,填完这个数后,a[i][j]和cur[i][j]不等,则也不合法

代码

#include<bits/stdc++.h>
using namespace std;
const int S=15,N=10,M=1<<22,INF=0x3f3f3f3f;
int n,m,a[S][S],b[S][S],cur[S][S];
bitset<M>dp[N][N];
char s[S][S];
bool ok;
bool in(int x,int y){
	return 0<=x && x<n && 0<=y && y<m && a[x][y]!=INF;
}
bool can(int x,int y,int v){
	for(int i=-1;i<=1;++i){
		for(int j=-1;j<=1;++j){
			int nx=x+i,ny=y+j;
			if(in(nx,ny) && cur[nx][ny]+v>a[nx][ny])return 0;
		}
	}
	if(in(x-1,y-1) && cur[x-1][y-1]+v<a[x-1][y-1])return 0;
	if(x==n-1 && in(x,y-1) && cur[x][y-1]+v<a[x][y-1])return 0;
	if(y==m-1 && in(x-1,y) && cur[x-1][y]+v<a[x-1][y])return 0;
	return 1;
}
void dfs(int x,int y,int w){
	//cnt++;
	if(x==n && y==0){
		ok=1;
		for(int i=0;i<n;++i){
			for(int j=0;j<m;++j){
				printf("%d",b[i][j]);
			}
			puts("");
		}
		return;
	}
	if(ok)return;
	if(dp[x][y][w])return;
	dp[x][y][w]=1;
	for(int v=0;v<=1;++v){
		if(ok)return;
		if(can(x,y,v)){
			b[x][y]=v;
			if(v){
				for(int i=-1;i<=1;++i){
					for(int j=-1;j<=1;++j){
						int nx=x+i,ny=y+j;
						if(!in(nx,ny))continue;
						cur[nx][ny]++;
					}
				}
			}
			int nw=(w<<1)|v;
			if(y==m-1)dfs(x+1,0,nw&((1<<(2*m))-1));
			else dfs(x,y+1,nw&((1<<(2*m+2))-1));
			if(v){
				for(int i=-1;i<=1;++i){
					for(int j=-1;j<=1;++j){
						int nx=x+i,ny=y+j;
						if(!in(nx,ny))continue;
						cur[nx][ny]--;
					}
				}
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i){
		scanf("%s",s[i]);
		for(int j=0;j<m;++j){
			a[i][j]=INF;
			if(s[i][j]!='_')a[i][j]=s[i][j]-'0';
		}
	}
	dfs(0,0,0);
	//printf("cnt:%d\n",cnt);
	return 0;
}

J.翻转硬币(整除分块+杜教筛)

题面

a44b8a9e5bc144938180959d7f0df09b.png

89912e23460645498efe890c3521effe.png

题解

1. 5e6,可以考虑埃筛枚举因数,x需要翻当且仅当x的真因数翻了奇数次

2. 1e9,观察5e6时的式子,其实就是莫比乌斯函数gif.latex?%5Cmu%28i%29模2意义下的值,

即只有0和1两种情况,此时可以认为是gif.latex?%7C%5Cmu%28i%29%7Cgif.latex?%5Cmu%28i%29%5E%7B2%7D,然后直接套杜教筛

3. 1e18,观察1e9时的式子或思考莫比乌斯函数的定义,

只有包含完全平方因子的数的gif.latex?%5Cmu值才为0,

所以,考虑对平方因子容斥,gif.latex?%5Csum_%7Bd%3D1%7D%5E%7B%5Cleft%20%5Clfloor%20%5Csqrt%20n%20%5Cright%20%5Crfloor%7D%5Cmu%28d%29*%20%5Cleft%20%5Clfloor%20%5Cfrac%7Bn%7D%7Bd*d%7D%20%5Cright%20%5Crfloor即为所求,

即:gif.latex?%5Csum_%7Bi%3D1%7D%5En%7B%5Cmu%28i%29%5E2%7D%20%3D%20%5Csum_%7Bd%3D1%7D%5E%7B%5Cleft%20%5Clfloor%20%5Csqrt%20n%20%5Cright%20%5Crfloor%7D%5Cmu%28d%29*%20%5Cleft%20%5Clfloor%20%5Cfrac%7Bn%7D%7Bd*d%7D%20%5Cright%20%5Crfloor

当然,化到这个式子的情况下,直接暴力也是可以通过1e9的数据的

然而,对于1e18,直接整除分块(数论分块)的话是gif.latex?O%28%5Csqrt%7Bn%7D%29​的,不能接受

于是,类似杜教筛预处理gif.latex?O%28n%5E%5Cfrac%7B2%7D%7B3%7D%29​前缀和的操作,

这里实际预处理gif.latex?%28%5Csqrt%7Bn%7D%29%5E%7B%5Cfrac%7B2%7D%7B3%7D%7D​部分的答案(询问是单组的,现算这部分效果是一样的)

用杜教筛预处理gif.latex?%5Cmu的前缀和,后面[1e6,1e9]的部分用整除分块配合gif.latex?%5Cmu的区间和解决

【SSL 2402】最简根式(杜教筛)(整除分块)_SSL_TJH的博客-CSDN博客,与这个题类似

复杂度感觉是gif.latex?O%28n%5E%5Cfrac%7B1%7D%7B3%7D%29​的,但据uoj群友说是gif.latex?O%28n%5E%5Cfrac%7B2%7D%7B5%7D%29​的,就不太懂了…

实际预处理到1e6交New Online Judge也是会TLE的,改到1e7才过

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+10;
bool ok[N];
int pr[N],mu[N],cnt,up;
map<int,int>smu;
ll n,ans[N];
void sieve(ll n){
    mu[1]=1;
    for(ll i=2;i<N;++i){
        if(!ok[i]){
            pr[cnt++]=i;
            mu[i]=-1;
        }
        for(int j=0;j<cnt;++j){
            ll k=i*pr[j];
            if(k>=N)break;
            ok[k]=1;
            if(i%pr[j]==0){
                mu[k]=0;
                break; 
            }
            mu[k]=-mu[i];
        }
    }
    for(int i=1;i<N;++i){
    	ans[i]=mu[i]*(n/i/i);
    }
    for(int i=2;i<N;++i){
        mu[i]+=mu[i-1];
        ans[i]+=ans[i-1];
    }
}
int djsmu(int n){
    if(n<N)return mu[n];
    if(smu.count(n))return smu[n];
    int ans=1;
    for(int l=2,r;l<=n;l=r+1){
        r=n/(n/l);
        ans=ans-(r-l+1)*djsmu(n/l);
        if(r==n)break;
    }
    return smu[n]=ans;
}
ll cal(ll n){
	int sq=sqrt(n);
	if(sq<N)return ans[sq];
	ll l=2;
	for(;l*l*l<=n;l++);
	ll res=ans[l-1];
	for(ll r;l*l<=n;l=r+1){
	    ll v=n/l/l;
		r=sqrt(n/v);
		res+=v*(djsmu(r)-djsmu(l-1));
	}
	return res;
}
int main(){
    scanf("%lld",&n);
    sieve(n);
    printf("%lld\n",cal(n));
    return 0;
} 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023第十四届蓝桥杯 C/C++大学生A组省赛 满分题解 的相关文章

  • 简单的C问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • 函数的不明确的引用/值版本

    考虑以下函数原型 void Remove SomeContainer Vec const std size t Index SomeContainer Remove SomeContainer Vec const std size t In
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 通过 EUSART PIC18F45K80 打印消息

    我正在尝试向 Docklight 发送串行消息 但始终收到空值 我正在使用带有 XC8 MPLAB X 的 PIC18F45K80 我的代码中的所有内容似乎都是正确的 但我想我错了 我该如何修复它 include
  • 使用 CMake 对 SDL 的未定义引用

    我正在使用 SDL v1 2 15 7 和 CMake 3 2 1 开发一个项目 在 h 文件中我添加了 include
  • 使用 Process.Start() 打开文件夹时访问被拒绝异常

    我有一个 C 中的 winforms 应用程序 我必须在其中打开某个文件夹 我用 System Diagnostics Process Start pathToFolder 这会导致以下异常 System ComponentModel Wi
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 将华氏温度转换为摄氏度的 C 程序始终打印零

    我需要一些关于用 C 语言将华氏温度转换为摄氏度的程序的帮助 我的代码如下所示 include
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName

随机推荐

  • 润和HCIP认证套件烧写镜像失败的问题解决

    为了学习OpenHarmony小型和标准设备的开发 买了润和的HCIP认证套件进行开发 按照https device harmonyos com cn docs documentation guide ide hi3516dv300 com
  • ora-12592 TNS:包错误

    导入数据发生 ora 12592 TNS 包错误 网上搜寻资料发现原因是导入时间长导致防火墙触发了 解决方法 1 关掉防火墙尝试导入 2 如果是用本地客户端导入可以尝试到服务器上导入 3 在数据库服务端和客户端配置sqlnet ora文件
  • Access、SQLite、HSQLDB、Sybase、MySQL、DB4O比较

    本文转自 http blog sina com cn s blog 465bc6c90100eums html 一 Access 数据类型有些另类 而且密码太容易被攻破 性能不高 只能用在Windows程序上 一般说来 单个表不超过10万少
  • Latex表和图的显示、引用和并列

    一 表 1 1表的生成 一般我在写论文时 会直接用https www tablesgenerator com生成表的latex编译代码 一般的编译代码如下 begin table htbp begin center caption 标题 l
  • 面试准备:海量数据的处理方式

    文章目录 背景 数据排序 分治 字典树 数据去重 哈希 压缩存储空间 面试题汇总 1 TopK 2 查找中位数 3 随机选择K个数 4 找出出现次数最多的IP 背景 海量数据的处理主要包括三个方面 数据排序 数据统计 数据计算 我们可以简单
  • 扫雷小游戏最详细讲解【C语言】

    大家好 我是同学 森 一名计算机爱好者 今天让我们进入小游戏开发学习模式 若有错误 请多多指教 小主使用的是VS2019编译器 点赞 收藏 留言 都是我创作的最大的动力 目录 大家好 我是同学 森 一名计算机爱好者 今天让我们进入小游戏开发
  • Git GUI,Git Bash,Git CMD之间的区别

    Git CMD就像使用git命令的常规Windows命令提示一样 它允许您通过命令行使用所有Git功能 如果您已熟悉Windows cmd并且只能在Windows上工作 则非常有用 Git Bash在Windows上模拟bash环境 它允许
  • Mysql JDBC和事务(细致而易懂)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 安装环境 一 JDBC 二 preparedstament和statement的区别 三 批量处理 四 事务提交控制 最后 安装环境 1 jdk17 2 MySQL8
  • Qt自定义类使用自定义含参信号与槽

    最近在自定义类中使用了信号来连接到MainWindow类中的槽函数 具体操作如下 要点一 继承QObject 在头文件中初始化自定义类MyThread1 这里由于继承的QThread已经继承了QObject 无需嵌套继承 故不必public
  • Flutter 凸起效果底部导航栏一

    大多app中都会带有底部导航栏 系统默认自带的导航条不够新颖 今天我们改造一下导航条 将中间的按钮起到凸起的效果 特别有的app 中间常用扫一扫功能 Flutter为我们提供了一个控件BottomNavigationBar 结合Bottom
  • Linux——(第九章)磁盘分区、挂载

    目录 一 Linux分区概述 1 原理介绍 2 硬盘说明 二 查看磁盘和分区 1 du查看文件和目录占用的磁盘空间 2 df查看磁盘空间使用情况 3 lsblk查看设备挂载情况 4 mount unmount 挂载 卸载 5 fdisk 分
  • 解决VS Code开发Python3语言自动补全功能

    https www cnblogs com yuer20180726 p 10942372 html 1 打开设置界面 2 使用快捷键组合 Ctrl Shift p 入setting 选中首选项的user setting模式设置界面 在打开
  • 华为OD机试真题 Java 实现【光伏场地建设规划】【2023Q1 100分】

    一 题目描述 祖国西北部有一片大片荒地 其中零星的分布着一些湖泊 保护区 矿区 整体上常年光照良好 但是也有一些地区光照不太好 某电力公司希望在这里建设多个光伏电站 生产清洁能源 对每平方公里的土地进行了发电评估 其中不能建设的区域发电量为
  • 求字符串最长公共前缀

    第一种方法 for循环第一个字符串 然后再for循环除了第一个字符串以外的其它字符串 比较其它字符串是否以某个字符串开头 从而找到公共前缀 function getCommonStr arr if arr Array isArray arr
  • 面向对象编程(概念)

    面向对象编程 概念 面向过程 面向对象 面向过程思想 1 步骤清晰简单 第一步做什么 第二步做什么 2 面对过程是和处理一些较为简单的题目 面向对象思想 1 物以类聚 分类的思维模式 思考问题首先会解决问题需要哪些分类 然后对这些分类进行单
  • 解决ImportError: No module named zlib问题

    今天在创建django工程时 报了这个错 其实前几天也遇见过当时是在装一个setuptools时 报了这个错误zlib not available按照网上的方法 装好之后重新编译自己的Python 结果没有反应 还是报错 zlib模块是用来
  • java elasticsearch_Java操作ElasticSearch

    java客户端连接到ElasticSearch服务器 创建maven工程 添加坐标 最好跟服务器elasticsearch一致 org elasticsearch client transport 6 2 4 net sf json lib
  • type和interface的区别

    type和interface都可以用来表示接口 但实际用的时候会有写差异 1 type和interface的相同点 都是用来定义对象或函数的形状 interface example name string age number interf
  • 修复Chrome浏览器下载速度慢的问题

    前言 本人使用Mac端进行操作 Win端操作大体基本相同 差别不大 放心食用 特色 操作简单 配套软件链接齐全 传送门 链接 https pan baidu com s 1vcCcPlHaUQmYrQldVM8UVQ pwd 0000 提取
  • 2023第十四届蓝桥杯 C/C++大学生A组省赛 满分题解

    写在前面 以下代码 目前均可通过民间OJ数据 dotcpp New Online Judge 两个OJ题目互补 能构成全集 可以到对应链接下搜题提交 感谢OJ对题目的支持 如果发现任何问题 包含但不限于算法思路出错 OJ数据弱算法实际超时