列舉和模擬

2021-10-21 22:49:05 字數 1480 閱讀 2179

列舉,或者說暴力列舉,聽起來好像比較簡單,只要把所有可能都列舉一遍並從中找出正確答案即可,但是列舉有乙個弊端——容易超時,所以必須想辦法優化。所以列舉不僅不必其他類別題目簡單,優化這一點可能難度還會超過其他題目。

下面是我在oj提交過的兩個題目:

1).火柴棒:

題目描述不在說了;

該題有兩個要點:

1.a和b不一定是個位數,可能是兩位甚至四位數;

2.所有火柴棒必須用上;

所以我們要利用已給的一位數棒數來算出所有三位數和四位數的棒數;

我們先用陣列將已知的十個數(從0至9)的棒數存起來,陣列儲存『1』所需的棒數,再以此類推;

那麼,比如11,就是兩個『1』所構成,所以陣列中儲存的『11』就是兩個『1』的棒數相加。那麼『11』就是乙個已知棒數,進而可以求出『111』,『1111』等數,再將『111』,『11』所需的棒數儲存至陣列,陣列,就求出了所有在給出的棒數中可以擺出來的最大乙個數和小於其的數,且需要使用數字m的棒數時直接呼叫陣列【m】即可;

又因為『+』,『=』各需兩個火柴棒,所以我們實際可用的棒數只有n-2-2個(n指給出的棒數),所以只要兩重迴圈將所有加數(設第乙個加數為x,第二個為y)都迴圈出來,所以兩加數所需的棒數為陣列【x】+陣列【y】,那麼和就是陣列【x+y】,又因為我們其實可用的只有n-4個棒數,所以只要陣列【x】+陣列【y】+陣列【x+y】等於n-4,這個式子就可以成立,也就多了一種可能;

2).最大連續和:

仍然先列要點:

1.資料範圍大;

2.子串行的開始和結尾不定;

首先先說一下我看到這道題的第一想法:

首先算出從第乙個數(x)至最後乙個數(y)的和(a),將其儲存在maxx,然後在雙重迴圈起點(j)和終點(i),那麼從第j個數到第i個數的和就是a減x到j-1再減i+1到y,如果有大於maxx的,再用maxx記錄;

但是這種演算法容易超時,因為資料範圍是100000;

這時需要優化,嘗試用另一種思想;

比如從二到第十個數,就是第一到第十減去第一,我們用sum來儲存當前的累加和,直接從第一開始列舉,一直累加,如果累加和小於零了,也就意味著後續的加法必定減小,也就是說不會大於該累加和,那麼我們就直接清零,也可以看作是完成了更換起點的步驟;

比如-3,4,9,-2,-5,8,-3,最大和就是從4到8的累加和,也就是14;

第一次累加時,-3是第乙個累加,在儲存之後清零,因為-3加4必定會減小4,所以沒有再次進行運算的意義,直接清零累加和即可;

但是我們必須先將其儲存後再進行清零,因為最大數可以為負數;

我當時的疑問:

4迴圈至-2時,累加和是必定減小的,那為什麼還要進行運算,也直接清零不好嗎?;

其實這個想法從樣例即可找出錯誤:迴圈至8時,-2,-5和8的合為一,也就是說相比4+9增加了一(4+9-2-5+8=14),所以,只有當累加和為負數時,其之後的累加和是必定在縮小的,即沒有了再記錄的意義,也就是會導致錯誤;

列舉本身並不複雜,但是因為多重迴圈,極容易超時,所以優化是在做列舉時必不可少的思想,也是列舉的主要難點;

列舉模擬較和工具方法

目錄 列舉比較 工具方法 測試 可以使用equals 也可以使用 public enum cardtype code 轉成列舉物件 param code return public static cardtype toenum integer code return null public stat...

列舉與模擬

我是一名新手程式設計師,今天來為比我還新手的人講解一下 列舉與模擬 一.什麼是列舉與模擬 二.試題講解 int ball 3000 for int i 10 i 2222 i ball i ball i 10 ball i 10 這裡火柴棒我們用 ball 來表示 純屬不知火柴棒的英語 這裡我們將每...

用普通類模擬列舉 列舉的原理

package com.yisces.y enum 用普通類模擬列舉 列舉的原理 author yisces public class enumprinciple private enumprinciple int num private number num 建立乙個靜態變數,型別為當前類,每乙個...