第一题
召唤神琨
第一种解法(暴力解法,只能跑通示例但是不能通过)
——————————————————
代码如下
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int nb=scan.nextInt();
int [] arr=new int[nb];
for(int i=0;i<nb;i++)
{
arr[i]=scan.nextInt();
}
int max=0;
if(nb>3)
for(int i=0;i<nb-2;i++)
{
for(int j=i+1;j<nb-1;j++)
{
for(int f=j+1;f<nb;f++)
{
max=Math.max(max, (arr[i]+arr[f])/arr[j]);
}
}
}
——————————————————————
第二种解法(正式解法,可以通过)
我们的思路
- 顺序是i<j<k
- (Wi+Wk)/Wj的最大值
- 我们从中间的那个数字开始记录
- 从下标1开始,到下边n-1结束
- 我们用三个数组
- 一个记录这个下标左边的最大值
- 一个记录这个下标右边的最大值
- 然后一个记录这个下标的值,即(Wi+Wk)/Wj的值
- 然后记录这个(Wi+Wk)/Wj的最大值
- 最后输出就行了
- 代码如下——————————
- import java.util.Scanner;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
- public class Main {
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- int nb=scan.nextInt();
- int [] arr=new int[nb];
- for(int i=0;i<nb;i++)
- {
- arr[i]=scan.nextInt();
- }
- int [] left=new int[nb];
- int [] right=new int[nb];
- int result=Integer.MIN_VALUE;
- left[0]=Integer.MIN_VALUE;
- right[nb-1]=Integer.MIN_VALUE;
- int left1=arr[0];
- int right1=arr[nb-1];
- for(int i=1;i<nb-1;i++)
- {
- left1=Math.max(left1,arr[i-1]);
- left[i]=left1;
- }
- for(int i=nb-2;i>0;i--)
- {
- right1=Math.max(right1,arr[i-1]);
- right[i]=right1;
- }
- for(int i=1;i<nb-1;i++)
- {
- result=Math.max((left[i]+right[i])/arr[i],result);
- }
- System.out.print(result);
- scan.close();
- }
- }
- ————————————
第二题
聪明的交换策略
如果我们就死板地考虑过程的话,那么就错了,因为过程太复杂了,我们根本就不知道应该怎么做
所以我们就面向结果编程
就只有两种情况
左边全是1右边全是0,1111100000000
左边全是0右边全是1,0000000111111111
所以我们就算出这两种情况的交换次数,然后再比较求出最小值就好了
- 代码如下
- ——————————
- import java.util.Scanner;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
- public class Main {
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- int nb=scan.nextInt();
- String s=scan.next();
- char crr[]=s.toCharArray();
- //记录我们遇到的是第几个0,和第几个1
- int a0=0;
- int a1=0;
- //左边全是0的情况
- int sum0=0;
- //左边全是1的情况
- int sum1=0;
- for(int i=0;i<nb;i++)
- {
- if(crr[i]=='1')
- {
- //这个是我们遇到第几个1的时候,应该往左边移动几次的算式
- a1++;
- sum1+=i-a1+1;
- }
- }
- for(int i=0;i<nb;i++)
- {
- if(crr[i]=='0')
- {
- //这个是我们遇到第几个0的时候,应该往左边移动几次的算式
- a0++;
- sum0+=i-a0+1;
- }
- }
- System.out.print(Math.min(sum0,sum1));
- scan.close();
- }
- }
- ——————————————————————
第三题
怪兽突击
- 我们有时候要考虑多种情况
- 一种是如果我们第一次不遍历完,而是直接多次相加遍历我们的a[i]+b[i],有没有可能更小?
- 如果我们第一轮所有怪兽都打完反而最小,那么我们后面剩下的打的次数显而易见,就选那个修改过后的数组里面,消耗体力最少的那个
- 但要是我们的怪兽没遍历完,那我们考虑的情况就复杂多了,有没有可能遍历完一轮怪兽消耗的体力,比我们多次重复之前的值耗费的体力少
- 例如我们这个示例
- 所以我们就要判断,我们是该重复打之前的怪兽划算一些呢?还是打后面的怪兽划算一些呢?
- 所以我们要记住之前打的怪兽的消耗的体力,要记录的是消耗体力最小那个,因为我们后面为了消耗体力最少,肯定要打消耗体力最小的怪兽
- 然后我们根据我们还要打怪兽的次数进行运算
- 代码如下
- ——————————————————————
- import java.util.Scanner;
- import java.io.*;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
- public class Main {
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- int n=scan.nextInt();
- int k=scan.nextInt();
- int nrr[]=new int[n];
- int krr[]=new int[n];
- for(int i=0;i<n;i++)
- {nrr[i]=scan.nextInt();}
- for(int i=0;i<n;i++)
- { krr[i]=scan.nextInt();}
- //因为我们的整数取值范围很大,所以我们用长整型
- long result=Long.MAX_VALUE;
- long sum=0;
- long tempmin=Long.MAX_VALUE;
- //我们每一轮都遍历,看看是继续向后面打怪兽划算,还是打之前的怪兽划算,反正我们取最小值就是了
- //我们依次向后面打怪兽就是了,看看到底是 哪次最划算,反正往后面打怪兽的所有情况我们都统计出来,然后取最小值了
- int m=Math.min(n,k);
- for(int i=0;i<m;i++)
- {
- sum+=nrr[i];
- //这个是找出我们之前打过的,且体力值改变后,体力消耗最少的怪兽
- tempmin=Math.min(tempmin,nrr[i]+krr[i]);
- result=Math.min(result,sum+(k-i-1)*tempmin);
- //sum+(k-i-1)*tempmin,这个东西就是重复打之前的体力值消耗最小的怪兽
- }
- System.out.print(result);
- scan.close();
- }
- }
- ——————————————————————————————
第四题
蓝桥快打
- 我们首先需要知道我们死之前,我们到底可以攻击几次
- 因为我们是先出手
- 所以攻击次数就是我们的血量除以对面的攻击力
- 为了我们开挂不明显,就是我们要拖的越久越好,就攻击次数越多越好
- 所以我们的攻击力就是对面的血量除以我们的攻击次数
- 然后根据对面的血量,我们血量除以攻击次数,就可以求出来我们的攻击值了
- 而且记住,我们的攻击次数,和我们的攻击值都要向上取整
- 代码如下
- ——————————————————————
- import java.util.Scanner;
- // 1:无需package
- // 2: 类名必须Main, 不可修改
- public class Main {
- public static void main(String[] args) {
- Scanner scan = new Scanner(System.in);
- int nb=scan.nextInt();
- int a,b,c;
- a=0;
- b=0;
- c=0;
- int arr[]=new int [nb];
- for(int i=0;i<nb;i++)
- {
- a=scan.nextInt();
- b=scan.nextInt();
- c=scan.nextInt();
- int gjcs=(int)Math.ceil((double)a/c);
- int attack=(int)Math.ceil((double)b/gjcs);
- arr[i]=attack;
- }
- for(int i=0;i<nb;i++)
- {
- System.out.println(arr[i]);
- }
- scan.close();
- }
- }
- ——————————————————————