AtCoder Beginner Contest 046(ABCD)题解

AtCoder Beginner Contest 046(ABCD)题解

传送门

A - AtCoDeer and Paint Cans

思路:用一个 s e t set set维护一下不同的数输出集合大小即可。

#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(){
	set<int>s;
	for(int i=0;i<3;i++){
		int x;
		scanf("%d",&x);
		s.insert(x);
	} 
	printf("%d\n",s.size());
	return 0;
}

B - Painting Balls with AtCoDeer

思路:组合数学,显然第一个数有 k k k种选择,剩下的数都是 k − 1 k-1 k1种选择。

a n s = k × ( k − 1 ) n − 1 ans=k\times(k-1)^{n-1} ans=k×(k1)n1

#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 ksm(ll a,ll n){
	ll ans=1;
	while(n){
		if(n&1) ans=ans*a;
		a=a*a;
		n>>=1;
	} 
	return ans;
}
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	printf("%lld\n",1LL*k*ksm(k-1,n-1));
	return 0;
}

C - AtCoDeer and Election Report

思路:按照题意模拟,一个两个数 x , y x,y x,y记录上一次比分,如果当前 a , b a,b a,b有比 x , y x,y x,y小的,就取他们两个的最大增加倍数,然后将他们倍乘,再赋值给 x , y x,y x,y,最后输出 x , y x,y x,y即可。

时间复杂度: O ( n ) O(n) O(n)

#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 n;
	ll x,y;
	scanf("%d%lld%lld",&n,&x,&y);
	for(int i=2;i<=n;i++){
		 ll a,b,c=0,d=0;
		 scanf("%lld%lld",&a,&b);
		 if(a>=x&&b>=y) {
		 	x=a,y=b;
		 	continue;
		 }
		 if(a<x){
		 	c=(x+a-1)/a;
		 }
		 if(b<y){
		 	d=(y+b-1)/b;
		 }
		 ll mx=max(c,d);
		 x=a*mx,y=b*mx; 
		 //printf("x=%lld,y=%lld\n",x,y);
	}
	printf("%lld\n",x+y);
	return 0;
}

D - AtCoDeer and Rock-Paper

思路:贪心,显然能出布要尽量出布,这样能保证不输,但是题目要求石头数目在每轮小于等于出布数目,所以我们用一个变量 x x x维护布的数量减去石头的数量,如果当前 x ≤ 0 x\leq0 x0,必须出石头,然后特判一下对面出什么,更新得分,否则出布,继续特判一下即可。

时间复杂度: O ( n ) O(n) O(n)

#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
char a[N];
int main(){
	scanf("%s",a);
	int n=strlen(a),x=0,ans=0;
	for(int i=0;i<n;i++){
		if(x<=0){
			x++;
			if(a[i]=='p') ans--;
		}
		else{
			x--;
			if(a[i]=='g') ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}

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