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;
}
posted @   zfxyyy  阅读(116)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示