[藍橋杯第十一屆校內模擬賽] Apare_xzc

華中師範大學藍橋杯第十一屆校內模擬賽

2020/3/22 8:00-12:00


在這裏插入圖片描述
題目還是比省賽要簡單的,我9:25就做完了。


第一題

在這裏插入圖片描述

分析:

        簡單題,求給定的1200000的正約數的個數。我們可以暴力判因數,也可以對x分解質因數。x = p1^t1 * p2^ t2 * ... * pk^tk,則約數個數爲(t1+1) * (t2+1) * ... * (tk+1)

暴力代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
void f(int x) {
	int ans = 0;
	for(int i=1;i<=x;++i) 
		if(x%i==0) ++ans;
	cout<<ans<<endl;
} 
int main(void) {
	f(1200000);
	return 0;
} 

在這裏插入圖片描述

分解質因數代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
void getAns(int x) {
	long long res = 1;
	for(int i=2;i<=x/i;++i) {
		if(x%i) continue;
		int c = 0;
		while(x%i==0) ++c,x/=i;
		res = res * (c+1);
	}
	if(x>1) res *= 2;
	cout<<res<<endl;
}
int main(void) {
	getAns(1200000);
	
	return 0;
}

在這裏插入圖片描述

答案爲:96


第二題:

在這裏插入圖片描述

答案爲:15.125GB = 15.125*1024MB = 15488MB


第三題:

在這裏插入圖片描述

分析:

        我們通過分析或尋找規律,可以得到n個節點的二叉樹葉子節點個數最多爲floor((n+1)/2)

答案:(2019+1) / 2 = 1010


在這裏插入圖片描述

分析:

        從1到2019循環一遍,逐個判斷即可。

代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main(void) {
	int ans = 0;
	for(int i=1;i<=2019;++i) {
		int x = i;
		int ok = 0;
		while(x) {
			if(x%10==9) ok=1;
			x/=10;
		}
		ans += ok;
	} 
	cout<<ans<<endl;
	return 0;
} 

在這裏插入圖片描述

答案:544


第五題:

在這裏插入圖片描述

分析:

        題意很簡單,就是問有多少個數,錢面有比它小的,後面有比它大的。
        只要前面的最小值小於x,後面的最大值大於x即可。我們可以維護前綴最大值和後綴最大值。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a[1001],Max[1001],Min[1001]; 
int main(void) {
	int n;cin>>n;
	for(int i=1;i<=n;++i) scanf("%d",a+i);
	Min[1] = a[1];
	for(int i=2;i<=n;++i) Min[i] = min(Min[i-1],a[i]);
	Max[n] = a[n];
	for(int i=n-1;i>=1;--i) Max[i] = max(Max[i+1],a[i]);
	int res = 0;
	for(int i=2;i<n;++i) {
		if(Min[i-1]<a[i]&&Max[i+1]>a[i]) ++res;
 	}
	cout<<res<<endl;
	return 0;
} 

第六題:

在這裏插入圖片描述

分析:

        dfs即可。暴力判斷應該也可以,但是1E6的nlogn常數稍大。

代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
int n,ans;
void dfs(int v,int pre) {
	if(pre*10+v>n) return;
	++ans;
	pre = pre*10+v;
	for(int i=v;i<10;++i)
		dfs(i,pre);
}
int main(void) {
	cin>>n;
	ans = 0;
	for(int i=1;i<=9;++i)
		dfs(i,0);
	cout<<ans<<endl;
	return 0;
} 

第七題:

在這裏插入圖片描述

分析:

        按題意模擬即可。

代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a[1000];
char s[1000];
bool isY(char c) {
	return (c=='a'||c=='e'||c=='i'||c=='o'||c=='u');
}
int main(void) {
	cin>>(s+1);
	int len = strlen(s+1);
	for(int i=1;i<=len;++i) {
		if(isY(s[i])) a[i] = 1;
		else a[i] = 0;
	} 
	int p = 1;
	if(a[1]!=0) {
		puts("no");return 0;
	}
	while(p<len&&a[++p]==0);
	if(a[p]!=1) {
		puts("no");return 0;
	}
	while(p<len&&a[++p]==1);
	if(a[p]!=0) {
		puts("no");return 0;
	}
	while(p<len&&a[++p]==0);
	if(a[p]!=1) {
		puts("no");return 0;
	}
	puts("yes");
	return 0;
} 

第八題:

在這裏插入圖片描述
在這裏插入圖片描述

樣例輸入:

4 5
.g...
.....
..g..
.....
2

樣例輸出

gggg.
gggg.
ggggg
.ggg.

分析:

        按照題意模擬即可。n,m,k範圍都是1000,模擬k天可能會被卡。我們可以做兩個小優化如果根本沒有g,那麼以後也沒有g,直接輸出如果已經長滿草了,那麼剩下的天數就不用再模擬了

代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <vector>
using namespace std;
const int N = 1001;
char a[N][N];
bool vis[N][N];
int n,m,k;
int dx[] = {1,-1,0,0};
int dy[] = {0,0,1,-1};
bool ok(int x,int y) {
	return (x>=0&&x<n&&y>=0&&y<m); 
} 
vector<pair<int,int> >v;
int main(void) {
	scanf("%d%d",&n,&m);
	int sz = 0;
	for(int i=0;i<n;++i) scanf("%s",a[i]);
	scanf("%d",&k);
	for(int i=0;i<n;++i) 
		for(int j=0;j<m;++j)
			if(a[i][j]=='g') ++sz,v.push_back(make_pair(i,j)),vis[i][j]=true;
	if(sz==0) { //根本就沒有草
		for(int i=0;i<n;++i) puts(a[i]);
		return 0;
	}
	while(k--) {
		int add = 0;
		for(int i=0;i<sz;++i) {
			for(int j=0;j<4;++j) {
				int x = v[i].first+dx[j];
				int y = v[i].second+dy[j];
				if(ok(x,y)&&!vis[x][y]) 
					vis[x][y]=true,v.push_back(make_pair(x,y)),a[x][y]='g',++add; 
			}
		}
		sz += add;
		if(sz==n*m) break; //已經長滿了
	}
	for(int i=0;i<n;++i) puts(a[i]);
	
	return 0;
} 

第九題:

在這裏插入圖片描述
在這裏插入圖片描述

分析:

        每個序列是否能再拓展只和倒數兩個數有關。我們可以藉此定義二維狀態。設dp[x][y]代表最後一個爲y,倒數第二個數爲x的數列能拓展出的數列個數。定義好狀態我們就可以記憶化搜索了。

代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
const int N = 1001;
const int mod = 10000;
int dp[N][N];
int dfs(int p1,int p) {
	if(dp[p1][p]) return dp[p1][p];
	int ans = 1, dif = abs(p1-p);
	for(int i=1;i<dif;++i)
		ans = (ans + dfs(p,i))%mod;
	return dp[p1][p] = ans;
}
using namespace std;
int main(void) {
	int n;
	while(cin>>n) {
		int res = 0;
		for(int i=1;i<=n;++i)
		    res = (res+dfs(n,i))%mod;
		cout<<res<<endl;
	}
	return 0;
} 

在這裏插入圖片描述


第十題:

在這裏插入圖片描述
在這裏插入圖片描述

樣例輸入:

5 3
3 1 2 5 4

樣例輸出:

3 5 4

自測的樣例輸入:

12 3
1 1 7 7  1 2 3 6 6 6  8 4

自測的樣例輸出:

7 8 4

分析:

        由題意值,我們要求的是字典序最大的長度爲m的子序列。字典序最大,我們肯定要貪心。我們再取面的數的時候,還需要考慮後面還有沒有節目可以選滿m個。所以,我們可以每次從[pos[i-1]+1,n-m+i]這個區間中找一個最靠前的最大值作爲pos[i]。靜態區間最大值我們可以用RMQ查詢,也可以用線段樹或樹狀數組。

代碼:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int N = 100001;
int Max[N][20],a[N],Log2[N]={-1},r[N],n;
int query(int x,int y) {
	if(x>y) swap(x,y);
	int j = Log2[y-x+1];
	int pa = Max[x][j], pb = Max[y-(1<<j)+1][j];
	return a[pa]<a[pb]?pb:pa;
}
int main(void) {
	int m,n;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d",a+i);
	for(int i=1;i<=n;++i) Max[i][0] = i,Log2[i]=Log2[i>>1]+1;
	for(int j=1;(1<<j)<n;++j) {
		for(int i=1;(1<<j)+i-1<=n;++i) {
			int pa = Max[i][j-1], pb = Max[i+(1<<(j-1))][j-1];
			Max[i][j] = a[pa]<a[pb]?pb:pa;
		}
	}
	r[1] = query(1,n-m+1);
	for(int i=2;i<=m;++i)
		r[i] = query(r[i-1]+1,n-m+i);
	for(int i=1;i<=m;++i)
		printf("%d%c",a[r[i]],i==n?'\n':' '); 
	return 0;
} 

xzc
2020/3/22 11:16


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章