Contestant. Rank 1837. Rating +17.
开局天崩场
A. Typical Interview Problem
题意
对于一个数字,如果它是
思路
显然,
有趣的是,
时间复杂度:
对应AC代码
import java.io.*;
import java.math.*;
import java.util.*;
import java.util.concurrent.atomic.*;
public class Main{
public static void main(String[] args) throws Exception{
Console console = new Console();
int t = console.nextInt();
nxt:
while(t -- > 0) {
int n = console.nextInt();
String s = "FBFFFBFFBFFBFBFFBFFBBFFBFBFFBFFB";
String x = console.next();
console.print(s.contains(x) ? "YES\n" : "NO\n");
}
console.close();
}
//快读模板 此处略去
//public static class Console implements Closeable {}
}
s开小了,倒大霉了属于是
B. Asterisk-Minor Template
题意
给定两个字符串,构造出一个模板,模板由 ‘*‘ 和字母组成,通配符 ‘*‘ 可以匹配自然数个任意字母。输出是否存在一种模板,使通配符的数量小于等于字母的数量。若存在,输出这个模板。
思路
要满足题给条件,那么模板一定需要存在两个连续的字母。考虑到可以任意匹配,我们不妨只找出一对字母,在两个字符串中均出现,如
当然,只要开头或结尾一样,一个字母加上一个通配符即可。
时间复杂度:
对应AC代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int, int>
const int N = 2e5 + 10, inf = 0x3f3f3f3f3f3f, mod = 998244353;
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int q;
cin >> q;
while(q --){
string a, b;
cin >> a >> b;
if(a[0] == b[0]) cout << "YES\n" << a[0] << '*' << '\n';
else if(a[a.size() - 1] == b[b.size() - 1]) cout << "YES\n" << '*' << a[a.size() - 1] << '\n';
else{
bool f = false;
for(int i=0;i<a.size() - 1;i++){
for(int j=0;j<b.size() - 1;j++){
if(a[i] == b[j] && a[i + 1] == b[j + 1]){
cout << "YES\n" << '*' << a[i] << a[i + 1] << '*' << '\n';
f = true;
break;
}
}
if(f) break;
}
if(!f) cout << "NO\n";
}
}
}
贪心一下~
C. Maximum Set
题意
给定两个整数
思路
首先,要让数量最多,且能整除,那么我们不妨将左端点循环乘二,得到一个不超过右端点的最大数,此时乘二的数量就是序列的最大数量
更简洁地看,我们将上述过程转化为一个表达式:
那么,显然
那么,整道题就可以变为遍历所有满足上述表达式的
上述思路的复杂度较高,考虑到推算较为简单,我们不妨直接推导式子:
设
同理,
那么,答案即为
当然,我们也可以二分,问题不大((
时间复杂度:一般般
对应AC代码
import java.io.*;
import java.math.*;
import java.util.*;
import java.util.concurrent.atomic.*;
public class Main{
public static void main(String[] args) throws Exception{
Console console = new Console();
long mod = 998244353;
long t = console.nextInt();
nxt:
while(t -- > 0) {
long n = console.nextInt(), m = console.nextInt();
long x = n, ans1 = 1, p = 1;
while(true){
if(x * 2 > m) break;
x *= 2;
ans1 ++;
p = (p * 2) % mod;
}
boolean ok = false;
long l1 = (long) Math.max(n - 1, (double) m * 2 / 3 / p), l2 = Math.max(l1 - 1, m / p);
long ans2 = (((l1 - n + 1) * ans1 % mod) + (l2 - l1) % mod) % mod;
console.print(ans1 + " " + ans2 + "\n");
}
console.close();
}
//快读模板 此处略去
//public static class Console implements Closeable {}
}
暴力枚举左端点的铸币竟是我自己
- 本文链接 https://floating-ocean.github.io/blog_old/posts/1514977487/
- 版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!