AtCoder Beginner Contest 045(ABCD)题解

AtCoder Beginner Contest 045(ABCD)题解

A - Trapezoids

思路:求梯形面积,显然 s = ( a + b ) h 2 s=\dfrac{(a+b)h}{2} s=2(a+b)h

#include
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first 
#define se second
int main(){
	int a,b,h;	
	cin>>a>>b>>h;
	int x=(a+b)*h/2;
	cout<<x<<endl;
	return 0;
}

B - Card Game for Three (ABC Edit)

思路:显然用三个指针分别指向对应选手,然后根据题意模拟即可。

时间复杂度: O ( ∑ l e n s t r ) O(\sum len_{str}) O(lenstr)

#include
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first 
#define se second
int main(){
	string a,b,c;
	cin>>a>>b>>c;
	int i=0,j=0,k=0,id=0;
	int x=a.size(),y=b.size(),z=c.size();
	while(1){
		if(i==x&&!id) return puts("A"),0;
		else if(j==y&&id==1) return puts("B"),0;
		else if(k==z&&id==2) return puts("C"),0;
		if(!id) id=a[i]-'a',i++;
		else if(id==1) id=b[j]-'a',j++;
		else if(id==2) id=c[k]-'a',k++;
	}
	return 0;
}

C - Many Formulas

思路: l e n ≤ 10 len\leq10 len10,显然暴力计算所有情况,用位运算暴力枚举求和即可。

#include
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first 
#define se second
ll num[15];
int main(){
	string a;
	cin>>a;
	int n=a.size();
	for(int i=1;i<=n;i++) num[i]=a[i-1]-'0';
	ll s=0;
	for(int i=0;i<(1<<(n-1));i++){
		ll x=num[1];
		for(int j=0;j<n-1;j++){
			if(i&(1<<j)){
				s+=x,x=num[j+2];
			}
			else x=x*10+num[j+2];
		}
		if(x) s+=x,x=0;
	}
	printf("%lld\n",s);
	return 0;
}

D - Snuke’s Coloring

思路:我们考虑每个格子作为左上角时会产生什么样的 3 × 3 3\times3 3×3方阵,显然对于每一个 a i , b i a_i,b_i ai,bi,我们把包含 ( a i , b i ) (a_i,b_i) (ai,bi)且作为左上角的格子贡献 + + ++ ++,然后对所有格子排个序,从左上角开始计算,计算当前格子有多少贡献即可,至于求 0 0 0个黑格的方阵,可以用所有的 3 × 3 3\times3 3×3方阵个数减去 1 − 9 1-9 19 3 × 3 3\times3 3×3方阵个数。

#include
using namespace std;
typedef long long ll;
const int N=1e6+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first 
#define se second
PII a[N];
int cnt,ans[N];
int main(){
	int h,w,n;
	scanf("%d%d%d",&h,&w,&n);
	for(int i=1;i<=n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		for(int r=x-2;r<=x;r++)
			for(int c=y-2;c<=y;c++)
			if(r>0&&c>0&&r+2<=h&&c+2<=w)
			a[cnt++]={r,c}; 
	}
	sort(a,a+cnt);
	for(int i=0,j;i<cnt;){
		 j=i+1;
		 int x=a[i].fi,y=a[i].se;
		 while(j<cnt&&x==a[j].fi&&y==a[j].se) j++;
		 ans[j-i]++;
		 i=j;
	}
	ll s=1LL*(h-2)*(w-2);
	for(int i=1;i<10;i++) s-=ans[i];
	printf("%lld\n",s);
	for(int i=1;i<10;i++) printf("%d\n",ans[i]);
	return 0;
}

你可能感兴趣的:(Atcoder题解)