第十五届的题目在规定时间内做出了前5道,还有2道找时间再磨一磨。现在把做的一些思路总结如下:
题1:握手问题
问题描述
小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7个人,这 7人彼此之间没有进行握手 (但这 7人与除这 7人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手?
注意 𝐴和 𝐵握手的同时也意味着 𝐵和 𝐴握手了,所以算作是一次握手。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
第一题,一个简单的握手问题,用排列组合公式计算即可。
50 * 49 / 2 - 7 * 6 / 2 = 1204
由于数据比较小,所有直接手算比较快。填空题直接打印结果即可。
public class Main {
public static void main(String[] args) {
System.out.print("1204");
}
}
结果是1204。
题2:小球反弹
问题描述
有一长方形,长为 343720 单位长度,宽为 233333单位长度。在其内部左上角顶点有一小球 (无视其体积),其初速度如图所示且保持运动速率不变,分解到长宽两个方向上的速率之比为 𝑑𝑥:𝑑𝑦=15:17。小球碰到长方形的边框时会发生反弹,每次反弹的入射角与反射角相等,因此小球会改变方向且保持速率不变(如果小球刚好射向角落,则按入射方向原路返回)。从小球出发到其第一次回到左上角顶点这段时间里,小球运动的路程为多少单位长度?答案四舍五入保留两位小数。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个小数,在提交答案时只填写这个小数,填写多余的内容将无法得分。
本题抓住一个关键: 如果小球刚好射向角落,则按入射方向原路返回。也就是我们只要找到第一次碰到角落时就可以了,然后将距离*2即可。(这是第一种方法,还可以模拟小球运动轨迹,分x,y轴依次计算。)
public class Main {
public static void main(String[] args) {
long t =1;
long x=343720,y=233333;
while (t>=1){
if((15*t)%x==0&&(17*t)%y==0){
break;
}
t++;
}
double res = 2*Math.sqrt(15*t*15*t+17*t*17*t);
System.out.printf("%.2f\n",res);
}
}
结果是1100325199.77
题3:好数
问题描述
一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。
给定一个正整数 𝑁,请计算从 1 到 𝑁 一共有多少个好数。
输入格式
一个整数 𝑁。
输出格式
一个整数代表答案。
这是一道很常见的循环题。对于个位、十位、百位...这种位数的数字,通常将其转换成字符数组。方便遍历位数上的数字。
我第一次做的想法是,先看最低位,也就是数组最后一位的Index,判断其奇偶,再结合数组总长。如果数组总长是奇数,则最后一位Index为偶数,此时个位,百位...对应的index就是偶数。此情况下,再判断其中数的奇偶性。数组总长是偶数同理。
代码实现如下:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n =scan.nextInt();
int cnt = 0;
for(int i = 0 ;i<n;i++){
String s = i+"";
char[] res = s.toCharArray();
cnt++;
if(res.length%2==0){
for(int j = res.length-1;j>=0;j--){
if(j%2!=0){
if(res[j]%2==0){
cnt--;
break;
}
}
if(j%2==0){
if(res[j]%2!=0){
cnt--;
break;
}
}
}
}
if(res.length%2!=0){
for(int j = res.length-1;j>=0;j--){
if(j%2==0){
if(res[j]%2==0){
cnt--;
break;
}
}
if(j%2!=0){
if(res[j]%2!=0){
cnt--;
break;
}
}
}
}
}
System.out.print(cnt);
}
}
题4:R格式
问题描述
小蓝最近在研究一种浮点数的表示方法:RR格式。对于一个大于 0 的浮点数 𝑑,可以用 RR 格式的整数来表示。给定一个转换参数 𝑛,将浮点数转换为 R格式整数的做法是:
将浮点数乘以 2^𝑛;
四舍五入到最接近的整数。
输入格式
一行输入一个整数 𝑛 和一个浮点数 𝑑,分别表示转换参数,和待转换的浮点数。
输出格式
输出一行表示答案:𝑑 用 R 格式表示出来的值。
很典型的一道高精度问题,可以尝试位运算求解
import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
BigDecimal d = sc.nextBigDecimal();
BigDecimal m = new BigDecimal("2");
System.out.println(m.pow(n).multiply(d).setScale(0, BigDecimal.ROUND_HALF_UP));
//m的n次方乘d,设置小数位为0,四舍五入取整
}
}
题5:宝石组合
问题描述
在一个神秘的森林里,住着一个小精灵名叫小蓝。有一天,他偶然发现了一个隐藏在树洞里的宝藏,里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状,但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个与生俱来的特殊能力,可以发出不同强度的闪光。小蓝共找到了 𝑁 枚宝石,第 𝑖 枚宝石的 “闪亮度” 属性值为 𝐻𝑖,小蓝将会从这 𝑁 枚宝石中选出三枚进行组合,组合之后的精美程度 𝑆可以用以下公式来衡量:
其中 𝐿𝐶𝑀 表示的是最小公倍数函数。
小蓝想要使得三枚宝石组合后的精美程度 𝑆尽可能的高,请你帮他找出精美程度最高的方案。如果存在多个方案 𝑆 值相同,优先选择按照 𝐻 值升序排列后字典序最小的方案。
输入格式
第一行包含一个整数 𝑁表示宝石个数。
第二行包含 𝑁 个整数表示 𝑁 个宝石的 “闪亮度”。
输出格式
输出一行包含三个整数表示满足条件的三枚宝石的 “闪亮度”。
第一次自己写,对了60%的数据,后面参考了一下其他佬写的,就透彻了
import java.util.Arrays;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
Arrays.sort(a);
int s=a[n-3];
int count=0;
int res[]=new int[3];
while(true) {
count=0;
for(int i=0;i<n;i++) {
if(a[i]%s==0) {
res[count]=a[i];
count++;
}
if(count==3) {
break;
}
}
s--;
if(count==3) {
break;
}
}
System.out.println(res[0]+" "+res[1]+" "+res[2]);
}
}