こんばんは。
ABCに参加するたびに記事を書いていたら大変&記事が大量生産されるので、サマリーして投稿をしていきたいと思います。
直近の戦績
レートの変動はこんな感じでした。
ABC-212:205→201
ABC-213:201→194
ABC-214:194→214
200前後をうろうろする日々となっていますが、214ではようやくC問題を解くことができ、ひさびさのプラスです。
ABC-212
B問題
4桁の暗証番号X1 X2 X3 X4がある。パスワードとして強度は十分か?
以下のいずれかを満たすと弱い。
・4つとも同じ数字
・1~3の任意の数字iについて、X(i+1)がX(i)の次の数字である。
2点目の「任意」について、どれか一つでもそういう組み合わせがあるとだめかと理解して組んだところWAになりました。テストケースを見て理解を改め書き直し。
import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
String x = sc.next();
char flg1 = '0';
char flg = '0';
int wk1 = 0;
int wk2 = 0;
if(x.charAt(0)==x.charAt(1)&&x.charAt(1)==x.charAt(2)&&x.charAt(2)==x.charAt(3)){
flg1 = '1';
}
for(int i=0;i<3;i++){
wk1 = Integer.parseInt(String.valueOf(x.charAt(i)));
wk2 = Integer.parseInt(String.valueOf(x.charAt(i+1)));
if((wk1+1)==(wk2)){
//System.out.println("a" + " " + (Integer.parseInt(x.charAt(i))+1);
//System.out.println("a");
flg = '1';
}else{
if(wk1==9&&wk2==0){
//System.out.println("b");
flg = '1';
}else{
flg = '0';
break;
}
}
}
if(flg1=='1'||flg=='1'){
System.out.println("Weak");
}else{
System.out.println("Strong");
}
}
}
ABC-213
A問題
A,Bを入力
A xor C = B が成り立つCを求める。
へ?どうやって?分からん・・
とりあえずAとBを2進数に変換して、排他的論理和が成り立つ2進数Cを求め、それを10進数変換。
正解には辿り着いたものの、めっちゃ時間かかる。
解説を読むと簡単に求める方法はあるようですが、ちょっと読んでも理解できず・・やばいな。
import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int awk = a;
int bwk = b;
int ah[] = new int[8];
int bh[] = new int[8];
int ch[] = new int[8];
int i = 7;
while(awk>0){
if(awk%2==0){
ah[i] = 0;
//System.out.println(awk);
}else{
ah[i] = 1;
}
awk = awk/2;
i--;
}
for(int j=i;j>=0;j--){
ah[j] = 0;
}
//for(int k=0;k<8;k++){
//System.out.println(ah[k]);
//}
//System.out.println("**b*********");
// b
i=7;
while(bwk>0){
if(bwk%2==0){
bh[i] = 0;
//System.out.println(bwk);
}else{
bh[i] = 1;
}
bwk = bwk/2;
i--;
}
for(int j=i;j>=0;j--){
bh[j] = 0;
}
//for(int k=0;k<8;k++){
//System.out.println(bh[k]);
//}
for(int k=0;k<8;k++){
if(bh[k]==1){
if(ah[k]==0){
ch[k]=1;
}else{
ch[k]=0;
}
}else{
if(ah[k]==0){
ch[k]=0;
}else{
ch[k]=1;
}
}
}
//System.out.println("******c*****");
int crui = 0;
int keisu = 1;
for(int k=7;k>=0;k--){
//System.out.println("ch[k] " + ch[k]);
crui = crui + ch[k]*keisu;
//System.out.println(crui);
keisu = keisu*2;
}
System.out.println(crui);
}
}
ABC-214
C問題
複雑なため、問題はサイトをご覧いただくのが良いと思います。
処理を2回回さないといけない点がなかなかやらしい。
サンプルケースではこの点も分からないし・・。
残り6秒で解けました。
import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long s[] = new long[n];
long t[] = new long[n];
long time = 0;
for(int i=0;i<n;i++){
s[i] = sc.nextLong();
}
long h[] = new long[n];
for(int i=0;i<n;i++){
t[i] = sc.nextLong();
if(i==0){
h[i] = t[i];
//System.out.println(t[i]);
time = s[i]+t[i];
}else{
if(t[i]>=time){
h[i] = time;
//System.out.println(time);
}else{
h[i] = t[i];
//System.out.println(t[i]);
}
if(t[i]>=time){
time = time + s[i];
}else{
time = t[i] + s[i];
}
}
}
long time2=time;
for(int i=0;i<n;i++){
if(i==0){
if(time2<=h[i]){
System.out.println(time2);
time2 = s[i]+time2;
}else{
System.out.println(h[i]);
time2 = s[i]+h[i];
}
}else{
///////////
if(h[i]>=time2){
System.out.println(time2);
}else{
System.out.println(h[i]);
}
///////////
if(h[i]>=time2){
time2 = time2 + s[i];
}else{
time2 = h[i] + s[i];
}
//System.out.println(h[i]);
}
//System.out.println(" time " + time + " t[i] " + t[i]);
}
//System.out.println(cnt);
}
}
最後に
C問題が久々に解けただけで、また頑張ろうと思い直しています。楽観的。