1. B - Piano
问题描述
有一个无限长的钢琴键盘。是否存在一个连续的片段,其中包含 W 个白键和 B 个黑键?
设 S 为通过无限重复字符串 wbwbwwbwbwbw 形成的字符串。
是否存在 S 的一个子字符串,其中包含 W 个 w(白键)和 B 个 b(黑键)?
限制
W 和 B 都是整数.
思路
字串由完整的"wbwbwwbwbwbw"加上某个前缀,某个后缀组成。用两个列表存储当前有多少个w,多少个b。
代码
#include <bits/stdc++.h>
using namespace std;
char s[20] = " wbwbwwbwbwbw";
int bx, wx;
int w[] = { 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7 };
int b[] = { 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5 };
int main() {cin >> wx >> bx;// cout<<w[12]<<" "<<b[12]<<endl;/*5*k + b[j] + 5 - b[i] = b7*k + w[j] + 7 - w[i] = w*/for (int i = 1; i <= 12; i++) {for (int j = 1; j <= 12; j++) {if ((bx - b[j] + b[i] - 5) * 7 == (wx - w[j] + w[i] - 7) * 5) {cout << "Yes" << endl;return 0;}}}cout << "No" << endl;return 0;
}
2. 造篱笆
【桶】
思路
代码:
#include<iostream>
#include<algorithm>using namespace std;const int N = 1e6 + 10;int n;
int h[N], m[N], ans[N];
int ma = 0, cnt = 0;
int main(){cin >> n;for (int i = 0; i < n; i++) cin >> h[i], m[h[i]]++;for (int i = 1; i <= 2000; i++){for (int j = 1; j <= 2000; j++){if (i != j){ans[i + j] = min(m[i], m[j]);}else{ans[i + j] = m[i] / 2;}}}for (int i = 1; i <= 4000; i++) ma = max(ma, ans[i]);for (int i = 1; i <= 4000; i++){if (ma == ans[i]) cnt++;}cout << ma << ' ' << cnt;return 0;
}
3. ABC枚举
代码:
#include<bits/stdc++.h>using namespace std;#define LL long longLL n, cnt;int main(){cin >> n;for (int i = 1; i * i * i <= n; i++){for (int j = i; j * j <= n / i; j++){cnt += (n / (i * j)) - j + 1;}}cout << cnt;return 0;
}
4.获取质数
/*
试除法判定质数
*/#include<iostream>
#include<algorithm>
using namespace std;const int N = 1e2 + 10;int n;
int a[N];bool is_prime(int n){if (n < 2) return false;for (int i = 2; i <= n / i; i++){if (n % i == 0) return false;}return true;
}int main(){cin >> n;for (int i = 0; i < n; i++){cin >> a[i];}for (int i = 0; i < n; i++){if (is_prime(a[i])) cout << "Yes" << endl;else cout << "No" << endl;}return 0;
}
5.筛质数
/**
埃式筛法要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。给出要筛数值的范围n,找出以内的素数。
先用2去筛,即把2留下,把2的倍数剔除掉;
再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;
接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
*/#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;
int n, primes[N];
int st[N]; //标记是否为质数
int cnt = 0;//一开始默认所有数都是质数 void get_prime(int n){for (int i = 2; i <= n; i++){if (!st[i]){//primes数组存储素数primes[cnt ++] = i; //如果i是质数,把i的倍数筛掉for (int j = i * 2; j <= n; j += i) st[j] = true; }}
} int main(){cin >> n;get_prime(n);cout << cnt; return 0;
}