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;
}