o0w0o / ARTS

ARTS 鸽友打卡🐦
2 stars 0 forks source link

cf 581 #82

Open hitolz opened 5 years ago

hitolz commented 5 years ago

cf 581 A https://codeforces.com/contest/1204/problem/A A题目内容: 说一个城市,一天有2的100次方分钟,有一列火车每隔1分钟、4分钟、16分钟。。发车,也就是每隔4的k次方发车,k>=0。一队人在s时间到达火车站,问这队人错过了多少列火车。时间s是二进制数。 思路: s转10进制数,for循环算4的多少次方是小于这个数的,每次加1

import java.math.BigInteger;
import java.util.Scanner;

public class Cf581A {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        BigInteger bigInteger = new BigInteger(s, 2);
        BigInteger four = new BigInteger("4", 10);
        int num = 0;
        for (int i = 0; i <= 100; i++) {
            BigInteger pow = four.pow(i);
            if (pow.compareTo(bigInteger) < 0) {
                num++;
            } else {
                break;
            }
        }

        System.out.println(num);
    }

}

B题 https://codeforces.com/contest/1204/problem/B B题目内容: 说一个人有个未知的数组a,有n个正整数,a数组有两个条件:1、数组中不同数字的个数大于等于l小于等于r,2、数组中每个元素要么是1,要么是2的倍数。数组有多种组合方式,求这些组合方式中所有元素和的最小值和最大值。 思路: 最小值就是最多个1 + l个不同数字,最大值就是最多个最大值 + r个不同数字

import java.util.Scanner;

public class Cf581B {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n, l, r;
        n = scanner.nextInt();
        l = scanner.nextInt();
        r = scanner.nextInt();
        int[] eles = new int[22];
        for (int i = 0; i <= 20; i++) {
            eles[i] = (int) Math.pow(2, i);
        }

        int min = 0;
        int max = 0;

        for (int i = 0; i < l; i++) {
            min += eles[i];
        }
        min += (n - l);

        for (int i = 0; i < r; i++) {
            max += eles[i];
        }
        max += (n - r) * eles[r - 1];

        System.out.println(min + " " + max);
    }
}