AtCoder Beginner Contest 336
1.AtCoder Beginner Contest 3282.AtCoder Beginner Contest 3313.AtCoder Beginner Contest 335
4.AtCoder Beginner Contest 336
AtCoder Beginner Contest 336
A - Long Loong
#include <bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
void solve()
{
int x;
cin >> x;
cout <<"L";
while(x--) cout<<"o";
cout<<"ng";
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
return 0;
}
B - CTZ
#include <bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
void solve()
{
int x;
cin >> x;
int ans = 0;
while(x){
if(x&1) break;
else{
ans++;
x >>= 1;
}
}
cout << ans <<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
return 0;
}
C - Even Digits
应该算是求贡献吧
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 1e12;
int X[5]={0,2,4,6,8};
void solve()
{
vector<int> dp;
dp.push_back(1);
dp.push_back(5);
while(dp.back()<=1e12) dp.push_back(dp.back()*5);
int n;
cin >> n;
n--;
int x = 0;
vector<int> path;
for(int i=dp.size()-1;i>0;i--)
{
int z=0;
while(x+dp[i-1]<=n&&z<4)
{
x += dp[i-1];
z++;
}
path.push_back(z);
}
reverse(path.begin(),path.end());
int z=1;
int ans = 0;
for(auto u:path){
ans += X[u]*z;
z *= 10;
}
cout << ans <<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
return 0;
}
D - Pyramid
经典快结束了顿悟
每一位数能表示的最大值与他相邻两位数有关。
例如 1 3 1,因为左右都是1所以中间那一位能表示的最大值只能是2。
显然a[1]和a[n]的最大值只能是1。
以最大值为1的点为起点跑广搜。
结束后数组中的最大值就是答案。
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2e5 + 10;
int a[N];
bool visl[N],visr[N];
void solve()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
a[1]=a[n]=1;
queue<pair<int,int>> path;
for(int i=1;i<=n;i++)
{
if(a[i]==1){
path.push({i,i});
visl[i] =visr[i] = true;
}
}
while(path.size()){
int fa=path.front().first;
int u =path.front().second;
path.pop();
if(u+1<=n&&fa!=u+1&&!visl[u+1]){
a[u+1] = min(a[u+1],a[u]+1);
//cout << u+1 <<" "<<a[u+1]<<endl;
path.push({u,u+1});
visl[u+1]=true;
}
if(u-1>0&&fa!=u-1&&!visr[u-1]){
a[u-1] = min(a[u-1],a[u]+1);
//cout << u-1 <<" "<<a[u-1]<<endl;
path.push({u,u-1});
visr[u-1]=true;
}
}
cout << *max_element(a+1,a+1+n)<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
return 0;
}
E - Digit Sum Divisible
数位dp板子题
确实不太懂
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2e5 + 10;
int a[20];
int len;
int dp[20][180][180];
int n;
int sum1;
int dfs(int pos,int sum,int mod,int flag)
{
if(sum > sum1) return 0;
if(pos==0) return sum==sum1 && mod==0;
if(!flag&&dp[pos][sum][mod]!=-1) return dp[pos][sum][mod];
int lim = flag ? a[pos] : 9;
int cnt = 0;
for(int i=0;i<=lim;i++)
{
cnt += dfs(pos-1,sum+i,(mod*10 + i)%sum1,flag && (i==a[pos]));
}
if(!flag) dp[pos][sum][mod] = cnt;
return cnt;
}
void solve()
{
cin >> n;
while(n)
{
a[++len] = n%10;
n /= 10;
}
int ans = 0;
for(int i=1;i<=len*9;i++)
{
sum1 = i;
memset(dp,-1,sizeof dp);
ans += dfs(len,0,0,1);
}
cout << ans <<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T = 1;
//cin >> T;
while(T--) solve();
return 0;
}
合集:
ABC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧