天天看點

百度-裁減網格紙 百度-罪犯轉移

百度-裁減網格紙

題目描述

度度熊有一張網格紙,但是紙上有一些點過的點,每個點都在網格點上,若把網格看成一個坐标軸平行于網格線的坐标系的話,每個點可以用一對整數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=;
            int xmax=;
            int ymin=;
            int ymax=;
            for(int i=;i<n;i++){
                line=scan.nextLine();
                String []lines=line.trim().split(" ");
                int tmp=Integer.parseInt(lines[]);
                xmin=tmp<xmin?tmp:xmin;
                xmax=tmp>xmax?tmp:xmax;
                tmp=Integer.parseInt(lines[]);
                ymin=tmp<ymin?tmp:ymin;
                ymax=tmp>ymax?tmp:ymax;
            }
            int max=(xmax-xmin)>(ymax-ymin)?xmax-xmin:ymax-ymin;
            if(max==&&n!=){
                System.out.println();
            }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[]);
            int t=Integer.parseInt(lines[]);
            int c=Integer.parseInt(lines[]);

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

            int sum=;
            int counter=;
            for(int i=;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個題目~加油!