AtCoder Beginner Contest 043题解(ABCD)

AtCoder Beginner Contest 043题解(ABCD)

传送门

A - Children and Candies (ABC Edit)

题意:求 ∑ i = 1 n i \sum\limits_{i=1}^n i i=1ni

思路:签到题,直接按照公式输出 n ( n + 1 ) 2 \dfrac{n(n+1)}{2} 2n(n+1)

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

#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;	
	cin>>n;
	cout<<n*(n+1)/2;
	return 0;
}

B - Unhappy Hacking (ABC Edit)

思路:按照题意模拟,用一个字符串数组维护即可。

时间复杂度: 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 ans[N];
int main(){
	string s;
	cin>>s;
	int n=s.size();
	int x=0;
	for(int i=0;i<n;i++){
		if(s[i]=='0') ans[++x]='0';
		else if(s[i]=='1') ans[++x]='1';
		else if(s[i]=='B'&&x){
			x--;
		}
	}
	for(int i=1;i<=x;i++) cout<<ans[i];
	cout<<ans;
	return 0;
}

C - Be Together

思路:因为数据只有 100 100 100,范围很小,直接暴力枚举即可。

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

#include
using namespace std;
typedef long long ll;
const int N=105+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 a[N];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	int ans=1e9;
	for(int i=-100;i<=100;i++){
		int sum=0;
		for(int j=1;j<=n;j++){
			sum+=(i-a[j])*(i-a[j]);
		}
		ans=min(ans,sum);
	} 
	cout<<ans;
	return 0;
}

D - Unbalanced

思路:居然是个思维题。。其实我们只需要直到 X X , X Y X XX,XYX XX,XYX类型的字符串即可。

证明:假设不存在 X X , X Y X XX,XYX XX,XYX即两个相同字母间最少间隔两个字符。

所以字符串应该是这样的形式: A X Y A X Y A X Y A AXYAXYAXYA AXYAXYAXYA

因为前四个字母不是满足条件的,所以每次加一个 A A A,都至少要加个两个其他的字母 X Y XY XY,所以永远也不可能满足条件的。

若存在 X X , X Y X XX,XYX XX,XYX这样的字符串即这样的字符串就是答案。

所以存在 X X , X Y X XX,XYX XX,XYX是满足答案的充要条件。

所以顺序遍历判断即可。

时间复杂度: 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 l=strlen(a);
	for(int i=0;i<l-1;i++){
		if(a[i]==a[i+1]){
			printf("%d %d\n",i+1,i+2);
			return 0;
		}
		if(a[i]==a[i+2]){
			printf("%d %d\n",i+1,i+3);
			return 0;
		}
	}
	puts("-1 -1");
	return 0;
}

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