【Atcoder训练记录】AtCoder Beginner Contest 389
训练情况

赛后反思
赛后VP的,C题忘记vector里面erase复杂度是 O(n) 的了,导致TLE了两发,换成双端deque就过了
A题
取字符串第一位和第三位取int相乘
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
string s; cin>>s;
int x = s[0] - '0';
int y = s[2] - '0';
cout<<x*y<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B题
求最小的 \(n\),使得 \(n! \ge x\),用while语句,每次乘 \(i++\),直到答案超过 \(x\) 停止,输出当前的 \(i\) 即可
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int x; cin>>x;
int ans = 1;
int i = 2;
while(i*ans<x){
ans*=i;
i++;
}
cout<<i<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C题
双端队列+前缀和,我们维护蛇的长度的前缀和,求蛇头的位置就是上一头的蛇尾位置,每次出队删除的时候记录一下长度,在输出的时候减掉出队的部分即可
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int q; cin>>q;
deque<int> a;
int now = 0;
int jian = 0;
while(q--){
int opt; cin>>opt;
if(opt == 1){
int l; cin>>l;
now += l;
a.push_back(now);
} else if(opt == 2){
jian = a[0];
a.pop_front();
} else if(opt == 3){
int k; cin>>k;
if(k==1) cout<<0<<endl;
else cout<<a[k-2]-jian<<endl;
}
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
D题

我们画一个半径逐渐扩大的圆,我们发现对答案的贡献一定是 \(4\) 的倍数,所以我们只需要判断最右端能到哪一个正方形即可,用勾股定理算能到最右端的哪个正方形,最后再对答案的贡献累加即可,记得开long long
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int x; cin>>x;
int ans = 0;
for(double i = 0.5;i<x;i++){
ans += floor(sqrt(x*x-i*i)-0.5)*4;
}
cout<<ans+1<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}

浙公网安备 33010602011771号