A 直接计算 即可 位数为k 首位数为 a 则 \(ans = a + (k - 1) \times 9\)
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
int k = 0, tmp = n;
while(tmp >= 10){
k++;
tmp /= 10;
}
cout << k * 9 + tmp << "\n";
}
}
---------------------------------------我是一条美丽的分割线
B 关键在于读题,相邻两个字母构成的单词 有重复 且不是 三连hhh这种即可
写法的话我赛场直接写了个26进制hash,但实际上二维的数组记录即可。
写挂了一发是因为memset写错了。。。。。。。。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f;
int main(){
int t;
cin >> t;
while(t--){
bool f[30];
memset(f, 0, sizeof f);
int n;
cin >> n;
string s;
cin >> s;
map<int, int> mp1, mp2;
for (int i = 0; i < n - 1; i++){
int hash_val = (s[i] - 'a') * 26 + (s[i + 1] - 'a');
if(i && s[i - 1] == s[i] && s[i] == s[i + 1] && !f[s[i - 1] - 'a']){
f[s[i - 1] - 'a'] = 1;
}
else mp1[hash_val]++;
}
bool ok = 0;
for (auto &x: mp1){
if(x.second > 1)ok = 1;
}
if(ok)puts("YES");
else puts("NO");
}
}
---------------------------------------我是一条美丽的分割线
C 水题,直接模拟即可。调了一会的原因是因为 数组开反了。。。。。。编辑器真的不舒服
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f;
int R, n;
char s[3][maxn];
bool check(int nx, int ny, int fr){
bool ok = 1;
while(ny < n){
//cout << nx << ny << endl;
if(fr == 3){
if(s[3 - nx][ny] == 'B') {
if(R <= nx){
break;
}
nx = 3 - nx, fr = nx;
}
else {
if(s[nx][ny + 1] != 'B'){
ok = 0;
break;
}
else ny++, fr = 3;
}
}
else {
if(s[nx][ny + 1] != 'B'){
ok = 0;
break;
}
else ny++, fr = 3;
}
}
return ok;
}
int main(){
int t;
cin >> t;
while(t--){
cin >> n;
for (int i = 1; i <= 2; i++){
for (int j = 1; j <= n; j++){
cin >> s[i][j];
}
}
R = n + 1;
for (int j = n; j >= 1; j--){
if(s[1][j] == 'B' && s[2][j] == 'B')R = j;
else break;
}
bool ok = 0;
if(s[1][1] == 'B')ok |= check(1, 1, 3);
if(s[2][1] == 'B')ok |= check(2, 1, 3);
if(ok)cout << "YES\n";
else cout << "NO\n";
}
}
---------------------------------------我是一条美丽的分割线
D 这个感觉也很水
设x是大的那个数,y是小的。
给x-y做一个因式分解,把这个数扩到比x,y的大情况,取最小值就可以了。
赛时T了两发是因为 没开同步(貌似第一发没算复杂度直接交了个根号n的做法。)
实际上这样预处理找因数并不优秀,可以每次优先找自己的最小因数,然后一直除就可以了。
然后卡着时限过了也是过。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 5;
bool isprime[maxn];
int prime[maxn];
int get_primes(int n)
{
memset(isprime,1,sizeof(isprime));
int tot = 0;
for (int i = 2; i <= n; i++)
{
if (isprime[i]) prime[tot++] = i;
for (int j = 0; prime[j] <= n / i; j++)
//判断条件解释:我们用primes[j]筛掉合数primes[j] * i,只用筛掉小于n的合数就可以了
{
isprime[prime[j] * i] = 0;
if (i % prime[j] == 0) break;
}
}
return tot;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t;
cin >> t;
int nummmm = sqrt(1e7);
int tot = get_primes(nummmm + 1);
while(t--){
int x, y;
cin >> x >> y;
if(x < y)swap(x, y);
if(x - y == 1) cout << -1 << endl;
else if(x == y) cout << 0 << endl;
else {
int ans = 0x3f3f3f3f;
int num = x - y;
for (int i = 0; i < tot && prime[i] < num; i++){
if((x - y) % prime[i])continue;
while(num % prime[i] == 0)num /= prime[i];
int k = y / prime[i] * prime[i];
while(k < y)k += prime[i];
ans = min(ans, k - y);
k = x / prime[i] * prime[i];
while(k < x)k += prime[i];
ans = min(ans, k - x);
}
if(num > 1){
int k = y/num * num;
while(k < y) k += num;
ans = min(k - y, ans);
k = x / num * num;
while(k < x) k += num;
ans = min(k - x, ans);
}
cout << ans << endl;
}
}
return 0;
}