蓝桥算法两周训练营--Day1

目录

T1:P2694 接金币 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

分析:

T2:P1372 又是毕业季I - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

分析:

T3:P1106 删数问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

分析:

T4:谈判 - 蓝桥云课 (lanqiao.cn)

代码:

分析:


T1:P2694 接金币 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

package 蓝桥算法两周训练营__普及组.Day1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

/**
 * @author yx
 * @date 2023-02-05 0:20
 */
//P2694 接金币 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
public class t1 {
    static class No implements Comparable<No> {
        int x;
        int y;

        No(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public int compareTo(No o) {
            return this.y - o.y;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int G = scanner.nextInt();
        for (int i = 0; i < G; i++) {
            int N = scanner.nextInt();
            boolean flag = true;
            ArrayList<No> list = new ArrayList<>();
            for (int j = 0; j < N; j++) {
                int x = scanner.nextInt();
                int y = scanner.nextInt();
                No no = new No(x, y);
                list.add(no);
            }
            Collections.sort(list);
            int x0 = 0;
            int y0 = 0;
            for (int j = 0; j < N; j++) {
                int x1 = list.get(j).x;
                int y1 = list.get(j).y;
                if (Math.abs(x1 - x0) > Math.abs(y1 - y0)) {
                    flag = false;
                    break;
                }
                x0 = x1;
                y0 = y1;
            }
            if (flag) {
                System.out.println("Abletocatch");
            } else {
                System.out.println("Notabletocatch");
            }
        }
    }
}

分析:

1、重写比较方法,按y轴坐标从小到大进行排序,让y轴数值更小的即接到金币所花费时间更小的先接

2、比较当前接到金币时到下一次接金币是否会超时,如果超时,则不能接到金币

T2:P1372 又是毕业季I - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

package 蓝桥算法两周训练营__普及组.Day1;

import java.util.Scanner;

/**
 * @author yx
 * @date 2023-02-05 0:20
 */
public class t2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int k = scanner.nextInt();
        System.out.println(n/k);
    }
}

分析:

题意是在n个数里面挑k个数使得其最大公约数最大

假如有9个人挑3个人使得其最大公约数最大应该怎么挑呢?显然是3 6 9

那么怎么输出该最大公约数呢?就是n/k

为什么?因为n/k是所选的人里面的最小数且是被选到的这些人里面的因子

例如,(n/k)*1, (n/k)*2, (n/k)*3 ... (n/k)*k,而最后一个数(n/k)*k一定是最接近n的数,这样才能保证公约数最大

T3:P1106 删数问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

代码:

package 蓝桥算法两周训练营__普及组.Day1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author yx
 * @date 2023-02-05 0:20
 */

/**
 * 芝士与你分享:s.erase(3,1);//从当前位置开始清除1个单位
 * 每次找到前面的数大于后面的数就要把前面的去掉,这样能使得删除部分数后最小
 * 为什么?比如132,我们删除3会变成12,删除1的话会变成32,12<32,所以应该按上述删
 */

//P1106 删数问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//https://www.luogu.com.cn/problem/solution/P1106?page=5
public class t3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        int k = scanner.nextInt();
        int temp=k;
        char[] arr = s.toCharArray();
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            list.add(arr[i]);
        }
        int length=list.size();
        //删除数据操作
        while (k-- != 0) {
            for (int i = 0; i < list.size()-1 ; i++) {
                if (list.get(i) > list.get(i + 1)) {
                    list.remove(i);
                    break;
                }
            }
        }
//        System.out.println(list.size());
//        System.out.println(length);
        if(length!=list.size()+temp){
            for (int i = 0; i <length-temp ; i++) {
                System.out.print(list.get(i));
            }
            return;
        }

        //去除前导零操作
        while (true){
            if(list.size()==1){//只剩最后一个数时直接退出
                break;
            } else if (list.get(0) == '0') {
                list.remove(0);
            } else {//当遇到一个非零数时,表示前导零已经不存在了,退出循环
                break;
            }
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
        }
    }
}

分析:

1、删除数字:每次找到前面的数字大于后面的数字就删掉,删除一次就从新回到原点,循环删除k次

2、去除前导零:因为题目说不改变数字的初始顺序,所以当出现001时,输出的为1,所以需要通过删除前导零这一操作

3、注意特殊情况:

数据是
2567889
3

答案是

2567

T4:谈判 - 蓝桥云课 (lanqiao.cn)

代码:

package 蓝桥算法两周训练营__普及组.Day1;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author yx
 * @date 2023-02-05 0:21
 */
//https://www.lanqiao.cn/problems/545/learning/
public class t4 {
//题意要我们求最小,那显然是贪心题
//样例输出是(1+3)+(1+3+5)+(1+3+5+9)=31
//我们发现1和3出现3次,5出现2次,9出现1次
//所以我们发现这道题需要让比较小的数加多点,较大的加少点,这样我们能使最后答案最小
//假设a<b,显然a+b+b+b>a+a+a+b
//所以我们需要排个序,然后进行花费计算
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n=scanner.nextInt();
        int[] arr=new int[n];
        int ans=0;
        for (int i = 0; i < n; i++) {
            arr[i]=scanner.nextInt();
        }
        Arrays.sort(arr);
        int count=arr[0];
        for (int i = 1; i < n; i++) {
            count+=arr[i];
            ans+=count;
        }
        System.out.println(ans);
    }
}

分析:

让最大的数出现的次数最少,一种典型贪心思想

  • //题意要我们求最小,那显然是贪心题

  • //样例输出是(1+3)+(1+3+5)+(1+3+5+9)=31

  • //我们发现1和3出现3次,5出现2次,9出现1次

  • //所以我们发现这道题需要让比较小的数加多点,较大的加少点,这样我们能使最后答案最小

  • //假设a<b,显然a+b+b+b>a+a+a+b

  • //所以我们需要排个序,然后进行花费计算

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小羊不会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值