Particle

競技プログラミングについての雑記

ARC #002

A.
念入りにテストしてたら、2分以上かかってしまいました。

int main(){
	int n;
	cin>>n;
	if(!(n%400)){
		cout<<"YES"<<endl;
	}else if(!(n%100)){
		cout<<"NO"<<endl;
	}else if(!(n%4)){
		cout<<"YES"<<endl;
	}else {
		cout<<"NO"<<endl;
	}
	return 0;
}

B.
Aを再利用できます。因みに、閏年は英語で a leap year です。

1月1日には必ず割り切れるので、1日ずつ進めていけば確かめれば解ける。

int table[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int uruu(int n){
	if(!(n%400)){
		return 1;
	}else if(!(n%100)){
		return 0;
	}else if(!(n%4)){
		return 1;
	}else {
		return 0;
	}
}

int main(){
	int y,m,d;
	scanf("%d/%d/%d",&y,&m,&d);
	
	while(1){
		if(!(y%(m*d))){
			printf("%d/%02d/%02d\n",y,m,d);
			return 0;
		}
		d++;
		if(d>table[m]+(m==2?uruu(y):0)){
			d = 1;
			m++;
			if(m>12){
				m = 1;
				y++;
			}
		}
	}
	return 0;
}

C.
全探索+greedy(LまたはRを使えるときは必ず使う)で解けます。何故greedyでいいのかは分かりませんが、合ってたみたいです。

string s;
char c[] = "ABXY";
string LR[16];
int n;

int f(int x,int y){
	int ans = 0;
	for(int i = 0; i < n; i++){
		ans++;
		if(i < n-1){
			if(s[i]==LR[x][0] && s[i+1]==LR[x][1]){
				i++;
			}else if(s[i]==LR[y][0] && s[i+1]==LR[y][1]){
				i++;
			}
		}
	}
	return ans;
}

int main(){
	for(int i = 0; i < 4; i++){
		for(int j = 0; j < 4; j++){
			LR[i*4+j] += c[i];
		}
	}
	
	for(int i = 0; i < 4; i++){
		for(int j = 0; j < 4; j++){
			LR[i*4+j] += c[j];
		}
	}
	
	cin>>n>>s;
	int ans = n;
	for(int i = 0; i < 16; i++){
		for(int j = i+1; j < 16; j++){
			ans = min(ans,f(i,j));
		}
	}
	cout<<ans<<endl;
	return 0;
}

86thでした