百度-裁减网格纸 百度-罪犯转移

本文解析了两个百度编程题目:“百度-裁减网格纸”和“百度-罪犯转移”。对于“百度-裁减网格纸”,介绍了如何通过计算点之间的最大距离来确定最小正方形面积的方法;对于“百度-罪犯转移”,提出了利用滑动窗口思想计算符合要求的犯人转移方案数量的解题策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

百度-裁减网格纸

题目描述
度度熊有一张网格纸,但是纸上有一些点过的点,每个点都在网格点上,若把网格看成一个坐标轴平行于网格线的坐标系的话,每个点可以用一对整数x,y来表示。度度熊必须沿着网格线画一个正方形,使所有点在正方形的内部或者边界。然后把这个正方形剪下来。问剪掉正方形的最小面积是多少。
输入描述:
第一行一个数n(2≤n≤1000)表示点数,接下来每行一对整数xi,yi(-1e9<=xi,yi<=1e9)表示网格上的点
输出描述:
一行输出最小面积
输入例子:
2
0 0
0 3
输出例子:
9

解题思路:比较简单的一道题,根据测试用例,只需要判断两点之间水平/垂直方向的最大距离,即求最大最小x和y。然后比较出最大距离求平方,然后需要注意,当只有一个点的时候实际上面积是1,而不是0。

import java.util.*;

public class Main{

    public static void main(String []args){
        Scanner scan=new Scanner(System.in);
        while(scan.hasNext()){
            String line=scan.nextLine();
            int n=Integer.parseInt(line.trim());
            int xmin=0;
            int xmax=0;
            int ymin=0;
            int ymax=0;
            for(int i=0;i<n;i++){
                line=scan.nextLine();
                String []lines=line.trim().split(" ");
                int tmp=Integer.parseInt(lines[0]);
                xmin=tmp<xmin?tmp:xmin;
                xmax=tmp>xmax?tmp:xmax;
                tmp=Integer.parseInt(lines[1]);
                ymin=tmp<ymin?tmp:ymin;
                ymax=tmp>ymax?tmp:ymax;
            }
            int max=(xmax-xmin)>(ymax-ymin)?xmax-xmin:ymax-ymin;
            if(max==0&&n!=0){
                System.out.println(1);
            }else{
                System.out.println(max*max);
            }
        }
    }

}

做了2天题目之后,对这个输入输出还算比较熟悉了~!。


百度-罪犯转移

C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?

输入描述:
第一行数据三个整数:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n),第二行按入狱时间给出每个犯人的罪行值ai(0≤ai≤1e9)
输出描述:
一行输出答案。
输入例子:
3 100 2
1 2 3
输出例子:
2

解题思路:类似计算流的方式吧?就是不回头的计算,避免重复工作。在计算c个罪行值和之后,每次减去第一个,增加后一个,满足条件就counter++。更好的应该是判断完当前情况减去最老的一个,然后读新数据时候再增加进行判断,这时候保持只有C个罪犯在内存中。

import java.util.*;

public class Main{

    public static void main(String []args) throws Exception{
        Scanner scan=new Scanner(System.in);
        while(scan.hasNext()){
            String line=scan.nextLine();
            String[] lines=line.trim().split(" ");
            int n=Integer.parseInt(lines[0]);
            int t=Integer.parseInt(lines[1]);
            int c=Integer.parseInt(lines[2]);

            int []crm=new int[n];
            line=scan.nextLine();
            lines=line.trim().split(" ");
            for(int i=0;i<n;i++){
                crm[i]=Integer.parseInt(lines[i]);
            }

            int sum=0;
            int counter=0;
            for(int i=0;i<c;i++){
                sum+=crm[i];
            }
            if(sum<=t){
                counter++;
            } 
            for(int i=c;i<n;i++){
                sum-=crm[i-c];
                sum+=crm[i];
                if(sum<=t){
                    counter++;
                }
            }
            System.out.println(counter);
        }
    }
}

感觉不错~今天30分钟就做完2个题目~加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值