AtCoder Beginner Contest 220

Posted 晁棠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 220相关的知识,希望对你有一定的参考价值。



A题题意:找出A到B之间第一个C的倍数

别忘记没有输出-1

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f


using namespace std;

int n,T;

void ready()
{
    IOS;
    int a,b,c;
    cin>>a>>b>>c;
    for(int i=a;i<=b;i++)
    {
    	if(i%c==0)
    	{
    		cout<<i;
    		return ;
		}
	}
	cout<<-1;
}


void work()
{
	
}

int main()
{
    ready();
    work();
    return 0;
}





题意:给出K进制下的A和B,请输出A和B在十进制下的相乘结果。

注意传参的时候也要long long。

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f


using namespace std;

int n,T;

void ready()
{
    IOS;
}

long long doit(ll k,ll t)
{
	long long res=0,d=1,ki=k;
	while(t)
	{
		if(t%10)
		  res+=(t%10)*d;
		d*=ki;		
		t=t/10;
	}
	return res;
}

void work()
{
	long long k,a,b;
	cin>>k>>a>>b;
	long long ai=doit(k,a),bi=doit(k,b);
	long long ans=ai*bi;
	cout<<ans;
}

int main()
{
    ready();
    work();
    return 0;
}





题意:A数组不断地1到n循环求和,求第一个大于B的值的是第多少个数。

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f


using namespace std;

int n,T;
long long a[100005],x;
void ready()
{
    IOS;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i];
    	a[i]+=a[i-1];
	}
	cin>>x;
	
}


void work()
{
	if(x<a[n])
	{
		for(int i=1;i<=n;i++)
		{
			if(a[i]>x)
			{
				cout<<i;
				return ;
			}
		}
	}
	long long cnt=x/a[n];
	x=x%a[n];
	for(int i=1;i<=n;i++)
	{
		if(a[i]>x)
		{
			cnt=cnt*n+i;
			cout<<cnt;
			return ;
		}
	}
}

int main()
{
    ready();
    work();
    return 0;
}




题意:左边两个数相加,或者相乘,得到的数取个位数上的数值,放置最左边,继续同样操作,统计最后剩下的一个数(0~9)出现的次数。

其实我也不知道我的做法是DP,我看了别人博客才知道原来这是DP呀,我还以为是平平无常的思维题hhh

每加入一个数,这个数要么有两种选择,加或乘,所以所有可能的状态都是由上一个数进来之后的所有结果决定了。

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f


using namespace std;

const int mod= 998244353;
int n,T;
long long a[15],b[15];

void ready()
{
    IOS;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	int t;
    	cin>>t;
    	if(i==1)
    	{
    		a[t]=1;
    		continue;
		}
		for(int j=0;j<10;j++)
		{
			if(a[j])
			{
				b[(j+t)%10]=(ll)(b[(j+t)%10]%mod+a[j]%mod)%mod;
				b[(j*t)%10]=(ll)(b[(j*t)%10]%mod+a[j]%mod)%mod;
			}
		}
		for(int j=0;j<10;j++)
		  a[j]=b[j],b[j]=0;
	}
	for(int i=0;i<10;i++)
	{
		cout<<a[i];
		if(i!=9)
		  cout<<'\\n';
	}
	  
}

int main()
{
    ready();
    return 0;
}





题意:输出一棵树每一个点,这个点到所有其他点的距离和。

感谢大佬的讲解:跳转

对于一个点i,他的儿子s,考虑s到随机一个点j。
如果j是s的儿子,则有dist(s,j)=dist(i,j)-1.
如果j不是s的儿子,则有dist(s,j)=dist(i,j)+1.

对于一个点s,它到所有的点的dist和可以由它的父亲的dist通过某条关系式得出。
先假设所有点j都不是s的儿子,有关系式。把所有点的距离加起来,然后再减去s的儿子点的影响,是答案,即:
ans[v]=ans[u]+n-2*son[v];

做法:
两次dfs,第一次计算ans[1],即1到所有点的距离和,顺便计算所有点的儿子数。
第二次dfs,求解每一个点的答案。

#include<iostream>
#include<algorithm>
#include<stdio.h>

using namespace std;
const int N=2e5+5;
int n;
int p[N],nxt[2*N],to[2*N],pi;
void add_in(int u,int v)
{
	pi++;nxt[pi]=p[u];p[u]=pi;to[pi]=v;
}
long long ans[N],son[N];
void dfs_1(int u,int cnt,int fa)
{
	int res=1;
	ans[1]+=cnt;
	son[u]++;
	for(int k=p[u],v=to[k];k;k=nxt[k],v=to[k])
	{
		if(v==fa) continue;
		dfs_1(v,cnt+1,u);
		son[u]+=son[v];
	}
}
void dfs(int u,int fa)
{
	for(int k=p[u],v=to[k];k;k=nxt[k],v=to[k])
	{
		if(v==fa) continue;
		ans[v]=ans[u]+n-2*son[v];
		dfs(v,u);
	}
}
int main()
{
	ios::sync_with_stdio(false),cin.tie(0);
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		add_in(u,v);
		add_in(v,u);
	}
	dfs_1(1,0,-1); 
	dfs(1,-1);
	for(int i=1;i<=n;i++) cout<<son[以上是关于AtCoder Beginner Contest 220的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242