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 115 题解