国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

2525.根據規(guī)則將箱子分類/并查集/動態(tài)規(guī)劃

這篇具有很好參考價值的文章主要介紹了2525.根據規(guī)則將箱子分類/并查集/動態(tài)規(guī)劃。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

2525. 根據規(guī)則將箱子分類 - 力扣(LeetCode)

給你四個整數?length?,width?,height?和?mass?,分別表示一個箱子的三個維度和質量,請你返回一個表示箱子?類別?的字符串。

  • 如果滿足以下條件,那么箱子是?"Bulky"?的:
    • 箱子?至少有一個?維度大于等于?104?。
    • 或者箱子的?體積?大于等于?109?。
  • 如果箱子的質量大于等于?100?,那么箱子是?"Heavy"?的。
  • 如果箱子同時是?"Bulky"?和?"Heavy"?,那么返回類別為?"Both"?。
  • 如果箱子既不是?"Bulky"?,也不是?"Heavy"?,那么返回類別為?"Neither"?。
  • 如果箱子是?"Bulky"?但不是?"Heavy"?,那么返回類別為?"Bulky"?。
  • 如果箱子是?"Heavy"?但不是?"Bulky"?,那么返回類別為?"Heavy"?。

注意,箱子的體積等于箱子的長度、寬度和高度的乘積。

示例 1:

輸入:length = 1000, width = 35, height = 700, mass = 300
輸出:"Heavy"
解釋:
箱子沒有任何維度大于等于 104 。
體積為 24500000 <= 109 。所以不能歸類為 "Bulky" 。
但是質量 >= 100 ,所以箱子是 "Heavy" 的。
由于箱子不是 "Bulky" 但是是 "Heavy" ,所以我們返回 "Heavy" 。

示例 2:

輸入:length = 200, width = 50, height = 800, mass = 50
輸出:"Neither"
解釋:
箱子沒有任何維度大于等于 104?。
體積為 8 * 106 <= 109?。所以不能歸類為 "Bulky" 。
質量小于 100 ,所以不能歸類為 "Heavy" 。
由于不屬于上述兩者任何一類,所以我們返回 "Neither" 。

提示:

  • 1 <= length, width, height <= 105
  • 1 <= mass <= 103

思路

用數學公式,然后進行判斷,返回值

完整代碼

class Solution {
    public String categorizeBox(int length, int width, int height, int mass) {
        long maxd = Math.max(length, Math.max(width, height)), vol = 1L * length * width * height;
        boolean isBulky = maxd >= 10000 || vol >= 1000000000, isHeavy = mass >= 100;
        if (isBulky && isHeavy) {
             return "Both";
        } else if (isBulky) {
            return "Bulky";
        } else if (isHeavy) {
            return "Heavy";
        } else {
            return "Neither";
        }
    }
}

?題目來源:【模板】并查集 - 洛谷

就是將要合并的數做成一個集合,然后再查找;

其實我覺得并查集好像最關鍵的就是找根節(jié)點,只要跟根節(jié)點扯上關系就能證明屬于一個集合;

所以首先我先做了一個查找根節(jié)點的函數



public static int find(int x,int p[])
{
    int x_root=x;
    while(p[x_root]!=-1)
    x_root = p[x_root];
    return x_root;

}

?首先我會讓所有數都指向自己,也就是我先都把他們的節(jié)點設為-1(因為題目中有說集合中的元素都是大于0的,就不用擔心出現漏洞;然后就是用循環(huán)一步步往上找,知道找到根節(jié)點,然后返回根節(jié)點的值;

public static void op(int x,int y,int p[])
{
    int x_root = x;
    int y_root = y;
    int find(int x,int p[]);
    x_root = find(x,p);
    y_root = find(y,p);
    if(x_root != y_root)
        p[x_root] = y_root ;
}

然后我又做了一個合并的函數,就是把有關系的集合合并起來,也是利用的根節(jié)點,先找到我要合并的集合的根節(jié)點,然后合并;

class Text(){
     public static void main(Sting[]args)
{
    int m,n;
    int x,y,z,v;
    int find(int x,int p[]);
    scanf("%d %d",&m,&n);
    int p[m+1];
    for(int i=1;i<=m;i++)
        p[i]=-1;
}

然后在主函數中,將數據都輸入,特別是將父節(jié)點數組全部初始化為-1。

  for(int i=0;i<n;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        if(x==1)
            op(y,z,p);
            if(x==2)
            {
                int y_root,z_root;
                y_root = find(y,p);
                z_root = find(z,p);
                if(y_root == z_root)
                    printf("Y\n");
                else
                    printf("N\n");
            }

    }
    return 0;
}

然后就是,判斷是做集合還是找集合,如果是1就是做集合,如果是2就是找集合,然后按條件輸出Y或者N;

2525.根據規(guī)則將箱子分類/并查集/動態(tài)規(guī)劃,java

2525.根據規(guī)則將箱子分類/并查集/動態(tài)規(guī)劃,java

?(最后交上去出來的結果也不是很好,發(fā)現時間有點超限,應該是數據類型不對,或者說我要用路徑壓縮)

改錯:

我知道為什么時間超限了,因為我沒有按照把小的樹往大的樹上面湊,而是隨便湊,那么這樣就會導致樹的深度變大,也就是說時間會變長,那么我只需要在我將集合合并的函數上加上一組判斷的語句;

public static void op(int x,int y,int p[],int rank[])
{
    int x_root = x;
    int y_root = y;
    int find(int x,int p[]);
    x_root = find(x,p);
    y_root = find(y,p);
    if(x_root != y_root)
        {
            if(rank[x_root] > rank[y_root])
               p[y_root]=x_root;
            else if(rank[x_root] < rank[y_root])
                p[x_root] = y_root;
            else
            {
                p[x_root] = y_root;
                rank[y_root]++;
            }
        }
}

rank[]數組就是樹的高度,首先判斷樹的高度,然后將小的樹往大的樹上面扣,這樣找的時候就能有效節(jié)省時間復雜度;

?例題一(鏈接)

# 【模板】最長公共子序列

## 題目描述

給出 $1,2,\ldots,n$ 的兩個排列 $P_1$ 和 $P_2$ ,求它們的最長公共子序列。

## 輸入格式

第一行是一個數 $n$。

接下來兩行,每行為 $n$ 個數,為自然數 $1,2,\ldots,n$ 的一個排列。

## 輸出格式

一個數,即最長公共子序列的長度。

## 樣例 #1

### 樣例輸入 #1

```
5?
3 2 1 4 5
1 2 3 4 5
```

### 樣例輸出 #1

```
3
```

## 提示

- 對于 $50\%$ 的數據, $n \le 10^3$;
- 對于 $100\%$ 的數據, $n \le 10^5$。

思路

本來我用的是滾動數組來做,但是還是時間超限了,我猜測應該不能一組數據一組數據的更新,然后看題目中說是由相同的數字組成,那么就是說只是順序不同,但元素是相同的,其實這個題就是LIS(參考文章),以一個串為模板串,然后判斷另一個串在這個串里面的排列順序;

代碼

class Text{

int inf = 100010l;

public static int min(int x,int y)
{
    return x<y?x:y;
}

public static void main(String[]args)
{
    
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int []p1 = new int[num];
    int []p2 = new int[num];
    int []dp = new int[num];
    int []map = new int[map];     //dp表示的是合乎題意的子串,map下標表示的是數值,而其對應的數字是該數值的位置;
    for(int i=1; i<=n; i++)
    {
        p1[i] = sc.nextInt();
        dp[i]=inf;            //初始化
        map[p1[i]]=i;         //明確一個串里面數字的順序,以便之后另一個串的數字在這個串里面找位置
    }
    for(int i=1; i<=n; i++)
        scanf("%d",&p2[i]);

    int len=0;               //找到的合乎題目意思的子串長度
    dp[0]=0;                 
    for(int i=1; i<=n; i++)
    {
        int xx=0,r=len,mid;  
        
        if(map[p2[i]]>dp[len])  //如果說p2第i個數字在p1中的位置大于已有的子串的最后一個數字

            dp[++len]=map[p2[i]];  //那么就把這個數字加入子串中
        else
        {
            while(xx<r)   //二分查找(就是更加方便查找,節(jié)省時間)
            {
                mid=(xx+r)/2;
                if(map[p2[i]]<dp[mid])
                    r=mid;
                else
                    xx=mid+1;
            }
            dp[xx]=min(map[p2[i]],dp[xx]);
        }
    }

    printf("%d",len);  //len就是子串的長度
  
}

例題二(編輯距離 - 洛谷)

# 編輯距離

## 題目描述

設 $A$ 和 $B$ 是兩個字符串。我們要用最少的字符操作次數,將字符串 $A$ 轉換為字符串 $B$。這里所說的字符操作共有三種:

1. 刪除一個字符;
2. 插入一個字符;
3. 將一個字符改為另一個字符。

$A, B$ 均只包含小寫字母。

## 輸入格式

第一行為字符串 $A$;第二行為字符串 $B$;字符串 $A, B$ 的長度均小于 $2000$。

## 輸出格式

只有一個正整數,為最少字符操作次數。

## 樣例 #1

### 樣例輸入 #1

```
sfdqxbw
gfdgw
```

### 樣例輸出 #1

```
4
```

## 提示

對于 $100 \%$ 的數據,$1 \le |A|, |B| \le 2000$。

思路

首先知道有倆個字符串,那么可以建一個二維數組arr[ i ][ j ],分別用于倆個字符串的遍歷;

然后根據題目可以知道,對于每一個字符,具有四種操作,刪除,插入,替換,不變;那么就可以判斷在不同情況下,該怎么更新arr里面的值;

當新遍歷的倆個字符相等時,就不要增加步驟,那么此時這個點的步驟就和沒新遍歷的那倆個字符時相等,即?:

arr[ i ][ j ] = arr[ i - 1 ][ j - 1 ];

當不滿足這個條件的時候,就考慮此時該進行什么操作,arr[ i ][ j - 1 ]表示的是增加一個字符的操作, arr[ i - 1 ][ j ]表示的是刪除一個字符的操作,arr[ i - 1 ][ j - 1 ]表示替換;文章來源地址http://www.zghlxwxcb.cn/news/detail-721989.html

代碼

#include<stdio.h>
#include<string.h>
#define num 3010

int min(int x,int y)
{
    return x<y?x:y;
}

int main()
{
    char A[num],B[num];
    int arr[num][num];
    int a,b;
    scanf("%s%s",A,B);
    a=strlen(A);
    b=strlen(B);
    int c=a>b?a:b;
    for(int i=1;i<=c;i++)
    {
        arr[i][0]=i;
        arr[0][i]=i;
    }
    for(int i=1; i<=a; i++)
        for(int j=1; j<=b; j++)
        {
            if(A[i-1]==B[j-1])
            {
                arr[i][j]=arr[i-1][j-1];
                
            }
               else
            arr[i][j]=min(min(arr[i-1][j],arr[i][j-1]),arr[i-1][j-1])+1;
        }
    printf("%d",arr[a][b]);
    return 0;
}

到了這里,關于2525.根據規(guī)則將箱子分類/并查集/動態(tài)規(guī)劃的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 并查集(種類并查集,帶權并查集)

    鏈接:登錄—專業(yè)IT筆試面試備考平臺_牛客網 來源:??途W ? 動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環(huán)形。A吃B,B吃C,C吃A。 現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們并不知道它到底是哪一種。 有人用兩種說法對這N個動物所

    2024年02月11日
    瀏覽(25)
  • 【藍橋模板】——如何用7行代碼,優(yōu)雅地拿捏并查集?(并查集模板)

    【藍橋模板】——如何用7行代碼,優(yōu)雅地拿捏并查集?(并查集模板)

    全文目錄?? ????????并查集-親戚問題 ??傳送錨點? ???思路點撥 ??代碼詳解?? ????并查集-藍橋幼兒園 ??傳送錨點 ???思路點撥 ??代碼詳解?? ??并查集-合根植物 ??傳送錨點 ???思路點撥 ??代碼詳解?? ???并查集-城邦 ??傳送錨點??????? ???思

    2023年04月09日
    瀏覽(17)
  • 力扣--并查集547.省份數量

    力扣--并查集547.省份數量

    思路分析: 首先定義變量 fa 用于記錄并查集,以及城市數量 n 。 定義了并查集的兩個函數, find 用于查找節(jié)點的根節(jié)點, togother 用于合并兩個節(jié)點所在的集合。 在公共函數 findCircleNum 中,初始化并查集,然后遍歷 isConnected 數組,將相連的城市進行合并。 最后使用 visited

    2024年03月26日
    瀏覽(21)
  • 高階數據結構 ——— 并查集

    高階數據結構 ——— 并查集

    并查集是一種樹型的數據結構,用于處理一些不相交集合的合并及查詢問題。 并查集通常用森林來表示,森林中的每棵樹表示一個集合,樹中的結點對應一個元素。 說明一下: 雖然利用其他數據結構也能完成不相交集合的合并及查詢,但在數據量極大的情況下,其耗費的時

    2024年02月03日
    瀏覽(66)
  • 修改數組【并查集】

    修改數組【并查集】

    并查集就是對集合的合并和查詢操作的統稱。他要求參與運算的兩個集合是不相交的(不含有相同的元素)。針對這兩個集合可以進行的操作: 1.合并:將兩個集合合并成一個集合。 2.查詢:查詢給定的兩個元素是不是在同一個集合中。 每一個并查集都使用一個樹來表示,數的

    2024年02月07日
    瀏覽(16)
  • 并查集

    并查集

    并查集 并查集是用來判斷兩個元素是否屬于同一個集合 即判斷他們的根節(jié)點是否相同 1. 初始化 2.查詢根節(jié)點 3.合并 集合變?yōu)橐粋€長長的鏈時,查找變得十分麻煩,此時我們需要路徑壓縮 即每個人的直接根節(jié)點就是最上面的根節(jié)點 我們判斷兩個元素是否是同一個集合,看的

    2024年02月08日
    瀏覽(16)
  • 【高階數據結構】——并查集

    【高階數據結構】——并查集

    在一些應用問題中, 需要將n個不同的元素劃分成一些不相交的集合。開始時,每個元素自成一個單元素集合, 然后按一定的規(guī)律將歸于同一組元素的集合合并 。在此過程中要 反復用到查詢某一個元素歸屬于那個集合的運算 。適合于描述這類問題的抽象數據類型稱為 并查集

    2024年02月16日
    瀏覽(23)
  • 并查集算法實現

    牛客測試鏈接 并查集(Disjoint Set)是一種用于處理集合合并與查詢問題的數據結構。它支持兩種操作:合并(Union)和查詢(Find)。 合并操作將兩個不相交的集合合并為一個集合,查詢操作用于判斷兩個元素是否屬于同一個集合。 本文將介紹并查集算法的實現,并給出一個

    2024年01月25日
    瀏覽(20)
  • 數據結構---并查集

    數據結構---并查集

    這里可以使用生活中的一個例子來帶著大家理解并查集,大家在上學的過程中肯定會發(fā)現一種現象,在開學之前大家誰也不認識誰每個人都是一個小團體,可是開學之后因為座位旁邊有一個同桌,所以開學沒多久你和同桌就會互相認識并且開心的玩在一起,那么這時就是兩個

    2024年02月15日
    瀏覽(22)
  • 【數據結構】--并查集

    【數據結構】--并查集

    目錄 一、概念 ?編輯 二、應用場景--“連接”問題(屬于同一Qu 三、實現思路 ?四、如何存儲數據 五、定義接口 1.初始化(init) 2.其他 isSame() 六、抽象類 六、Quick Find【v1 所在集合的所有元素都指向?v2 的根節(jié)點】 1.Union 1.Union圖解 2.注意點:? 3.代碼實現 2.find? 1.find圖

    2023年04月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包