day28(3.31)

作者分享了自己作为新手在编程学习中的经历,目前专注于基础算法如动态规划、前缀和、滑动窗口等,目标是进入学校ACM队伍,参与即将举行的程序设计比赛,并通过暑期培训准备ICPC。文章中给出了一道涉及二分查找的编程题作为实例。
摘要由CSDN通过智能技术生成

依旧是自闭的打卡时间,才练了短短不到一个月的时间,还有好多的知识点不会,起步本来就比人家慢了,等比赛完把,打完比赛慢慢学,dp,前缀和拆分,滑动窗口,难一点的搜索。现在只会一点简单的板子题和基础的字符串,简单数论等,而且这些题目还不能保证全对,篮球杯,过点样例就行了,想进学校的acm,5-6月份应该有一次学校的比赛,选拔并培训参加湖南省程序设计竞赛和之后的icpc等比赛,先把篮球杯打完吧,打完再学其他知识,争取进校赛,暑期培训打icpc。

1.路标设置

    package erfentx;
    
    import java.util.*;
    import java.io.*;
    /*路标设置11
     *一条公路,n个起始路标,新增m个路标,使得“空旷指数”最小 
     * 二分查找答案的模板题
     * 
     * 
     */
    public class lubiao {
        static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        
        static int N =(int)1e5 + 10,l,n,k;
        static int[] a= new int [N];
        static int left =0,right = Integer.MAX_VALUE;
        
        //使得相邻两个路标之间的距离>=mid情况下,在添加k个路标
        //符合上述情况,r=mid,距离还可以更小,否则l= mid+1;
        //知道左右两边界是相等的,此时的left即为满足要求的最小距离
        
        private static boolean check(int x) {
            int cnt =k,pre =0;
            for(int i=1;i<=n;i++) {
                
                if(cnt<0) {//无法再设置路标
                    return false;
                }
                //两个相邻的路标距离<x,不再需要设置路标
                if(a[i] -pre<=x) {
                    pre = a[i];//保留最小距离的下标
                    continue;
                }
                //当前路标-pre路标的小于mid值
                pre +=x;//mid
                i--;
                cnt--;//设置了一个路标
            }
            return cnt>=0;
        }
        
        
        public static void main(String[] args) throws IOException {
            String [] lnk = in.readLine().split(" ");
            l = Integer.parseInt(lnk[0]);
            n = Integer.parseInt(lnk[1]);
            k = Integer.parseInt(lnk[2]);
            
            String s[] = in.readLine().split(" ");
            
            for(int i=1;i<=n;i++) {
                a[i] = Integer.parseInt(s[i - 1]);
                right = Math.max(right, a[i] - a[i-1]);
            }
        
            //二分模板
            while(left < right) {
                int mid = left + ((right - left) >> 1);
                if(check(mid)) {
                    right = mid;
            }else {
                left = mid+1;
            }
            }
            out.print(left);
            out.flush();
            in.close();
        }
    }
2,,3,4你们来写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

螺上螺

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

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

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

打赏作者

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

抵扣说明:

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

余额充值