算法训练#14:Review Site和GCD Length

43 阅读3分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情

第一题

Review Site

题目理解

有三种观众给一个刚上映的电影投票(投“好”或者“差”):

  1. 看过这电影,投“好”的
  2. 看过这电影,投“差”的
  3. 没看过这电影,根据他看到的“好”和“差”的数量来投票的

但是你事先知道这位观众是哪一种观众,并且你可以给他看你想让他看到的投票情况

要求统计出能得最多“好”的情况下“好”有多少个

输入

第一行输入整数tt表示案例的个数、,其中1t1041\le t\le10^{4}
案例的第一行输入整数nn、,其中3n503\le n\le 50
案例的第二行输入nn个整数代表数组元素,其中1每一个数组元素31\le 每一个数组元素\le 3

输出

输出一个整数——表示能得到“好”的最大值

思路

这里若是不去制造假象(给将要投票的观众看你想让他看到的投票情况),那么就得在遍历的时候,把两种投票结果的人数都统计下来,而且到后面还会出现平票的情况,题目中并没有说到平票情况,我们又不能去猜样例,所以只能制造假象。要是制造假象的话,这种题就简单很多了,我们直接把差评的隐藏起来就行,转化为代码也就是计数就可以了

代码

import java.util.Scanner;

public class Review_Site {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            int n=sc.nextInt();
            int[] x=new int[n];
            for(int j=0;j<n;j++) {
                x[j] = sc.nextInt();
            }
            System.out.println(x.length-cal(x,2));
        }
    }
    public static int cal(int[] x,int n)
    {
        int count=0;
        for(int i=0;i<x.length;i++)
        {
            if(x[i]==n)
                count++;
        }
        return count;
    }
}

第二题

GCD Length

题目理解

给出三个数a,b,c,要求找出三个整数符合以下条件

  1. 第一个整数是十进制a位的
  2. 第二个整数是十进制b位的
  3. 第三个整数是a和b的最大公因数,是c位的 (例:100是十进制三位整数)

输入

第一行输入整数tt表示案例的个数、,其中1t2851\le t\le 285
案例输入整数aabbcc,其中1a,b9,1cmin(a,b)1\le a,b\le 9,1\le c\le min(a,b)\

输出

输出两个整数——一个aa位的整数和一个bb位的整数

思路

对最大公因数有指定长度要求的话,那么我们就不能随便去找那两个整数了,最简洁明了的方法,就是去找质数,也就是去找一个ac+1a-c+1位质数(下文统称为xx)、一个bc+1b-c+1位质数(下文统称为yy)以及一个cc位质数下文统称为zz,那么输出x×zx\times zy×zy\times z是不是就可以了呢?实际上还需要一个前提,那就是x,y,zx,y,z这三者必须足够小,因为若超出一定范围,那么x×zx\times zy×zy\times z就会有一个超出所要求的位数。

代码

import java.util.Scanner;

public class GCD_Length {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            int a=sc.nextInt();
            int b=sc.nextInt();
            int c=sc.nextInt();
            int gcd=find(c);
            int x=find(a-c+1)*gcd;
            int y=find(b-c+1)*gcd;
            if(b==a)
                y=y+gcd;
            System.out.println(x+" "+y);
        }
    }
//    找出n位质数
    public static int find(int n){
    //这里是重中之重,因为若是使用在所有数中寻找质数的方法,那么必定会导致超时,因为找高位质数所用的时间实在太长,就算是o(n)复杂度的方法找质数都不行,这里只能耍一下赖,自己用找质数的方法先找出相应位数足够小的质数,然后把它放到switch里面,就可以达成o(1)的复杂度了
        switch (n) {
            case 1:
                return 2;
            case 2:
                return 11;
            case 3:
                return 103;
            case 4:
                return 1013;
            case 5:
                return 10007;
            case 6:
                return 100003;
            case 7:
                return 1000003;
            case 8:
                return 10000003;
            case 9:
                return 100000003;
            default:
                return -1;
        }

    }

}