“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情”
第一题
题目理解
有三种观众给一个刚上映的电影投票(投“好”或者“差”):
- 看过这电影,投“好”的
- 看过这电影,投“差”的
- 没看过这电影,根据他看到的“好”和“差”的数量来投票的
但是你事先知道这位观众是哪一种观众,并且你可以给他看你想让他看到的投票情况
要求统计出能得最多“好”的情况下“好”有多少个
输入
第一行输入整数表示案例的个数、,其中
案例的第一行输入整数、,其中
案例的第二行输入个整数代表数组元素,其中
输出
输出一个整数——表示能得到“好”的最大值
思路
这里若是不去制造假象(给将要投票的观众看你想让他看到的投票情况),那么就得在遍历的时候,把两种投票结果的人数都统计下来,而且到后面还会出现平票的情况,题目中并没有说到平票情况,我们又不能去猜样例,所以只能制造假象。要是制造假象的话,这种题就简单很多了,我们直接把差评的隐藏起来就行,转化为代码也就是计数就可以了
代码
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;
}
}
第二题
题目理解
给出三个数a,b,c,要求找出三个整数符合以下条件
- 第一个整数是十进制a位的
- 第二个整数是十进制b位的
- 第三个整数是a和b的最大公因数,是c位的 (例:100是十进制三位整数)
输入
第一行输入整数表示案例的个数、,其中
案例输入整数、、,其中\
输出
输出两个整数——一个位的整数和一个位的整数
思路
对最大公因数有指定长度要求的话,那么我们就不能随便去找那两个整数了,最简洁明了的方法,就是去找质数,也就是去找一个位质数(下文统称为)、一个位质数(下文统称为)以及一个位质数下文统称为,那么输出和是不是就可以了呢?实际上还需要一个前提,那就是这三者必须足够小,因为若超出一定范围,那么和就会有一个超出所要求的位数。
代码
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;
}
}
}