day14—编程题
文章目录
- 1.第一题
- 1.1题目
- 1.2思路
- 1.3解题
- 2.第二题
- 2.1题目
- 2.2思路
- 2.3解题
1.第一题
1.1题目
描述:
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
1.2思路
- 定义一个数组存放每个月对应的天数
- 用输入的day数加上每个月对应的天数
1.3解题
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
int month = sc.nextInt();
int day = sc.nextInt();
int sum = 0;
int[] array = {31,59,90,120,151,181,212,243,273,304,334,365};
//由于数组的下标是从0开始的,所以每一个月对应的下边应该是本月的月份减去2
if(month >=2){
sum += array[month - 2];
}
sum += day;
//只有当月份大于2才用考虑要不要加一天的问题
if(month > 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){
sum += 1;
}
System.out.println(sum);
}
}
2.第二题
2.1题目
描述:
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。
输入描述:
第一行输入一个正整数n(n ≤ 1000) 第二行为n个数正整数xi(xi ≤ 1000)
输出描述:
输出可以产生的幸运的袋子数
2.2思路
- 先将球按照上面的数字放在数组中,将球按照上面的数字进行排序
- 当sum的值大于multi的时候,让幸运袋子的数目加1并且继续看后面的球是否可以和前面的球继续组成幸运袋子
- 特殊情况array[i]==1:继续看后面的球是否可以和前面的球继续组成幸运袋子,因为1和任何数的和都大于它和任何数的积
- 当一个球无法和前面的的球组成幸运的袋子,就直接break,因为和后面的球一定无法组成幸运的袋子
- 当当前的球无法和后面的球构成幸运袋子的时候,需要判断后面是否还有和当前的球相等的球,由于球都是一样的,避免重复判断
2.3解题
import java.util.*;
public class Main {
//产生幸运袋子的数目
//array中存放的是球的号码数,pos是遍历的起始位置,sum是和,multi是积
public static int count(int[] array, int pos, int sum, int multi) {
int ret = 0;
for (int i = pos; i < array.length; i++) {
sum += array[i];
multi *= array[i];
if (sum > multi) {
//当sum的值大于multi的时候,让幸运袋子的数目加1并且继续看后面的球是否可以和前面的球继续组成幸运袋子
ret = ret + 1 + count(array, i + 1, sum, multi);
} else if (array[i] == 1) {
//特殊情况array[i]==1:继续看后面的球是否可以和前面的球继续组成幸运袋子,因为1和任何数的和都大于它和任何数的积
ret = ret + count(array, i + 1, sum, multi);
} else {
//当一个球无法和前面的的球组成幸运的袋子,就直接break,因为和后面的球一定无法组成幸运的袋子
break;
}
//当返回上层递归的时候,需要回溯,继续计算前面的号码和当前位置后面的号码是否可以构成幸运的袋子
sum -= array[i];
multi /= array[i];
//当当前的球无法和后面的球构成幸运袋子的时候,需要判断后面是否还有和当前的球相等的球,由于球都是一样的,避免重复判断
while (i < array.length - 1 && array[i] == array[i + 1]) {
i++;
}
}
return ret;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] array = new int[n];
for (int i = 0; i < array.length; i++) {
array[i] = sc.nextInt();
}
Arrays.sort(array);
int ret = count(array, 0, 0, 1);
System.out.println(ret);
}
}