山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

yukicoder contest 197 の感想

問題

yukicoder contest 197 - yukicoder

昨日のyukicoderのコンテストの振り返りです。

No.721 Die tertia (ディエ・テルツィア)

No.721 Die tertia (ディエ・テルツィア) - yukicoder

日付に関する問題です。JavaAPIにカレンダーに関するクラスがあります。それを利用すると簡単かもしれません。

コード
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class Exec0721 {
    public static void main(String[] args) {
         Calendar calendar = Calendar.getInstance();
         Scanner scan = new Scanner(System.in);
         String s = scan.next();
         scan.close();
         int year = Integer.parseInt(s.substring(0, 4));
         String month = s.substring(5, 7);
         String day = s.substring(8, 10);

         if(month.charAt(0) == '0'){
             month = month.substring(1, 2);
         }
         if(day.charAt(0) == '0'){
             day = day.substring(1, 2);
         }

         SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
         calendar.set(year, Integer.parseInt(month) - 1, Integer.parseInt(day));
         //System.out.println(sdf.format(calendar.getTime()));
         calendar.add(Calendar.DATE, 2);

         System.out.println(sdf.format(calendar.getTime()));

    }
}

No.722 100×100=1000

No.722 100×100=1000 - yukicoder

正規表現などを知っていないと実装がめんどくさくなるんでしょうか。

コード
import java.util.Scanner;

public class Exec0722 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String A = scan.next();
        String B = scan.next();
        scan.close();
        int cnt1 = 0;
        int cnt2 = 0;
        for(int i = 0; i < A.length(); i++) {
            if(A.charAt(i) == '0') {
                cnt1 ++;
            }
        }
        for(int i = 0; i < B.length(); i++) {
            if(B.charAt(i) == '0') {
                cnt2 ++;
            }
        }

        if(A.charAt(0) != '-' && B.charAt(0) != '-') {
            if(cnt1 >= 2 && cnt2 >= 2 && cnt1 == A.length() - 1 && cnt2 == B.length() - 1) {
                int t1 = Integer.parseInt(A.substring(0, 1));
                int t2 = Integer.parseInt(B.substring(0, 1));
                int ans = t1 * t2;
                System.out.print(ans);
                for(int i = 0; i < cnt1 + cnt2 - 1; i++) {
                    System.out.print("0");
                }
                System.out.println();
            }else {
                long t1 = Integer.parseInt(A);
                long t2 = Integer.parseInt(B);
                long ans = t1 * t2;
                if(ans >= 0) {
                    String k = Long.toString(ans);
                    if(k.length() <= 8) {
                        System.out.println(k);
                    }else {
                        System.out.println("E");
                    }
                }
            }
        }else if(A.charAt(0) != '-' || B.charAt(0) != '-') {
            long t1 = Integer.parseInt(A);
            long t2 = Integer.parseInt(B);
            if(t1 < 0) {
                t1 = -t1;
            }
            if(t2 < 0) {
                t2 = -t2;
            }
            String A1 = Long.toString(t1);
            String B1 = Long.toString(t2);
            if(cnt1 >= 2 && cnt2 >= 2 && cnt1 == A1.length() - 1&& cnt2 == B1.length() - 1) {
                long ans = t1 * t2;
                String k = Long.toString(ans);
                k = k.substring(0, k.length() - 1);
                System.out.println("-" + k);
            }else {
                long ans = t1 * t2;
                if(ans >= 0) {
                    String k = Long.toString(ans);
                    if(k.length() <= 8) {
                        System.out.println("-" + k);
                    }else {
                        System.out.println("E");
                    }
                }

            }
        }else {
            if(cnt1 >= 2 && cnt2 >= 2 && cnt1 == A.length() - 2&& cnt2 == B.length() - 2) {
                int t1 = Integer.parseInt(A.substring(1, 2));
                int t2 = Integer.parseInt(B.substring(1, 2));
                int ans = t1 * t2;
                System.out.print(ans);
                for(int i = 0; i < cnt1 + cnt2 - 1; i++) {
                    System.out.print("0");
                }
                System.out.println();
            }else {
                long t1 = Integer.parseInt(A);
                long t2 = Integer.parseInt(B);
                long ans = t1 * t2;
                if(ans >= 0) {
                    String k = Long.toString(ans);
                    if(k.length() <= 8) {
                        System.out.println(k);
                    }else {
                        System.out.println("E");
                    }
                }
            }
        }
    }
}

No.723 2つの数の和

No.723 2つの数の和 - yukicoder

個人的にはNo. 722より簡単な問題でした。

各数字の個数を数え上げます。

例えば、 X = 18 として、

 10 の個数を a_{10} 8 の個数を a_8 とすると、 2 a_{10} \times a_8 = 2a_{10} \times a_{X - 10} が10と8を使って18となる数です。

コード
import java.util.Scanner;

public class Exec0723 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int X = scan.nextInt();
        int l = 100001;
        long []a = new long[l];

        for(int i = 0; i < N; i++) {
            a[scan.nextInt()] ++;
        }
        scan.close();
        long ans = 0;
        for(int i = 0; i < l; i++) {
            int res = X - i;
            if(res >= 0 && res <= 100000) {
                ans += a[i] * a[res];
            }
        }
        System.out.println(ans);
    }
}

感想

途中で別のことをやっていてコンテスト中ずっと問題を解いていたわけではないので、A問題しかとけませんでした。まあ、時間があっても解けたかどうかは分かりませんが。