AtCoder Beginner Contest 046(ABCD)题解

​传送门​

A - AtCoDeer and Paint Cans

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

#include<bits/stdc++.h>
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<int,int>
#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 k−1种选择。

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

#include<bits/stdc++.h>
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<int,int>
#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<bits/stdc++.h>
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<int,int>
#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 x≤0,必须出石头,然后特判一下对面出什么,更新得分,否则出布,继续特判一下即可。

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

#include<bits/stdc++.h>
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<int,int>
#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;
}