第十五届蓝桥杯大赛软件赛省赛C/C++ 研究生组

发布于:2025-04-17 ⋅ 阅读:(79) ⋅ 点赞:(0)

A

审题!
“连续的 k 次正确敲击,如果任意连续的两次敲击间间隔时间都小于等于 1s,那么我们称这是一次K 连击”
=>k连击要求:

  • 连续的正确操作
  • 任意相邻的两次操作时间间隔不超过1s

则时间间隔少于1s但是中间有错误操作的不满足连续的正确操作。转化问题时一定注意是否完全等价,是否有遗漏的特殊情况。

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2e3 + 10;
struct logs{
	char a, b;
	ll t;
}ls[N];

bool cmp(logs l1, logs l2){
	return l1.t < l2.t;
} 
int main(){
//	int n = 2000, k = 1, num = 0;
//	char ta, tb;
//	ll tt;
//	for(int i = 0; i < n; i++){
//		scanf("%c %c %lld", &ls[i].a, &ls[i].b, &ls[i].t);
//		getchar();
//	}
//	sort(ls, ls + n, cmp);
//	for(int i = 0; i < n; i++){
//		if(ls[i].a != ls[i].b) {//中断,统计当前连击数量
//			k = max(num, k);
//			num = 0;
//		}
//		else if(abs(ls[i].t - ls[i - 1].t) > 1000){
//			k = max(num, k);
//			num = 1;
//		}
//		else num++;
//	}
//	printf("%d", k);
	cout << 9; 
	return 0;
} 

B

数据很大暴力是不可能的了,打表发现大于等于10的B(i)都可以整除100,问题转化为找到A(i)=i(i+1)/2整除100的数,即i(i+1)%200 == 0
再次打表发现每1e3个里面有20个的规律,则n/100020再加上n/10001000到n之间的数量,是大于9之后的总数。
小于等于9的里面还有一个A(1) - B(1) = 0,A(3) - B(3) = 0也满足

#include<iostream>
using namespace std;
typedef long long ll;

bool judge(ll x){
	ll two = 3, five = 2, t = x + 1;
	while(two && x % 2 == 0){
		x /= 2;
		two--;
	}
	while(five && x % 5 == 0){
		x /= 5;
		five--;
	}
	
	while(two && t % 2 == 0){
		t /= 2;
		two--;
	}
	while(five && t % 5 == 0){
		t /= 5;
		five--;
	}
	if(!two && !five) return true;
	return false;
}

int main(){
	ll n = 2024041331404202L, ans = n / 1000 * 20;
	for(ll i = 2024041331404001L; i <= n; i++){//计算大于10的个数 (用规律) 
		if(i % 200 == 0 || (i + 1) % 200 == 0 || judge(i)) ans++;
	}
	cout << ans + 2;//1,3也满足,即计入小于10的个数 (打表判断) 
	return 0;
} 

C

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int a[N], mp[10] = {1, 0, 0, 0, 1, 0, 1, 0, 2, 1};

bool cmp(int a, int b){
	int fa = 0, fb = 0, ta = a, tb = b;
	if(!ta) fa = mp[0];
	if(!tb) fb = mp[0];
	while(ta){
		fa += mp[ta%10];
		ta /= 10;
	}
	while(tb){
		fb += mp[tb%10];
		tb /= 10;
	}
	if(fa != fb) return fa < fb;
	return a < b;
}

int main(){
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		scanf("%d", a + i);
	}
	sort(a, a + n, cmp);
	for(int i = 0; i < n; i++){
		printf("%d ", a[i]);
	}
	return 0;
} 

D

AC 20%

#include<iostream>
#include<string>
using namespace std;
typedef long long ll;
const int N = 210, M = 110;
string s[N];
bool st[N]; 
int main(){
	int n, m, ans = 0, cur, p;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> s[i];
		s[i] = " " + s[i] + s[i];
	}
	st[1] = true;
	for(int i = 1; i <= n; i++){
		cur = 0;
		for(int j = i + 1; j <= n; j++){
			int dp[M][M] = {0};
			for(int x = 1; x <= 2*m; x++){
				for(int y = 1; y <= 2*m; y++){
					if(s[i][x] == s[j][y]) {
						dp[x][y] = dp[x - 1][y - 1] + 1;
						if((st[i] || st[j]) && cur < dp[x][y]){
							p = j;
							cur = max(cur, dp[x][y]);
						}
					}
					else dp[x][y] = 0;
				}
			}
		}
		if(cur > m) cur = m;
		st[p] = true;
		ans += cur;
	}
	cout << ans;
	return 0;
} 

E

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N];
int p, n, m;
ll ans = 0;
int main(){
	scanf("%d%d", &n, &m);
	for(int i = 0; i < n; i++){
		scanf("%d", a + i);
	}
	sort(a, a + n);
	if(a[0] >= 0 || a[n - 1] <= 0) {//全是非负数 
		for(int i = n - 1; i >= 0; i--){
			if(abs(a[i]) <= m){
				ans = i + 1;
				break; 
			}
		}
	}
	else{
		p = n;
		for(int i = 0; i < n; i++){
			if(!a[i] || (a[i] > 0 && p == n)){
				 p = i;
				 break;
			}
		}
		for(ll l = 0; l < p; l++){
			for(ll r = p; r < n; r++){
				if(2*abs(a[l])+a[r] > m) continue;
				ans = max(ans, r - l + 1);
			}
		}
	}
	printf("%lld", ans);
	return 0;
} 

F

G

AC50%

#include<iostream>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int x[N], f[N];
int main(){
	int n, ans = 0;
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		scanf("%d", &x[i]);
	}
	for(int i = 0; i < n; i++){
		scanf("%d", &f[i]);
	}
	for(int i = 0; i < n; i++){
		for(int j = i + 1; j < n; j++){
			if(f[i] != j && f[j] != i) ans = max(ans, x[i]^x[j]);
		}
	}
	printf("%d", ans);
	return 0;
} 

H

I

G


网站公告

今日签到

点亮在社区的每一天
去签到