sql實現用容量分別為5L和6L的桶量出3L的水的辦法
最近看到論壇裡牛蛙的一個帖子(udfrog),總結了其寫過的比較有意思的sql。
看到幾個題目也想自己玩下,看到標題這個題目覺得跟以前碰到過的用3L、5L桶量出4L水的例子有點像,就也寫了一個:
with
tmp0 as (--容量為5L和6L的桶:
select 5 n from dual union all
select 6 n from dual),
tmp1(a, b, p) as (
select n a, n, '('||n||')' p from tmp0 union all
select n-a, b.n, a.p || '(' || b.n || '-' || a.a || ')' from tmp1 a, tmp0 b
where a.a < b.n --不能出現負數的情況
and b.n <> a.b --每次用另一個桶
and instr(a.p,'2')=0 --確保最短路徑
)
select a, b, p from tmp1
where a = 3 --得到3L水
結果如下:
A B P
---------- ---------- --------------------------------------------------------------------------------
3 5 (5)(6-5)(5-1)(6-4)(5-2)
3 6 (5)(6-5)(5-1)(6-4)(5-2)(6-3)
即:
先把5L的桶裝滿,然後倒入6L的桶(6-5),還剩1L的空間,再把5L的桶裝滿倒入6L的桶(此時桶內有5L升水,所以6L桶裝滿後5L桶就剩下4L,5-1=4),
把6L桶倒光後,再將5L桶中的4L水倒入6L桶,再把5L桶裝滿,再用5L桶把6L桶裝滿(此時6L桶有4L水,再倒入2L水就慢了,所以5L桶中還剩3L水)。
所以,最後剩下的3L水在5L桶裡面(即B欄位)。
另外一個選擇就是到6L桶裡面的做法。
推算過程有些地方沒有說明出來,比如,什麼時候水倒光,什麼時候水倒滿。不過,可以從整體數字來看出,桶是滿的還是有多少水剩餘的。
這個sql同樣適用於容量為3L、5L的桶量出4L水的例子:
A B P
---------- ---------- --------------------------------------------------------------------------------
4 5 (3)(5-3)(3-2)(5-1)
為了更好的通用性,把目標水量也寫到前面:
with
tmp00 as (select '4' t from dual),
tmp0 as (
select 3 n, t from tmp00 union all
select 5 n, t from tmp00),
tmp1(a, b, p, t) as (
select n a, n, '('||n||')' p, '' t from tmp0 union all
select n-a, b.n, a.p || '(' || b.n || '-' || a.a || ')', b.t from tmp1 a, tmp0 b
where a.a < b.n
and b.n <> a.b
and instr(a.p,b.t)=0
)
select a, b, p, t from tmp1
where a = t
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-2124390/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle實現連乘的辦法Oracle
- [SQL Server]分頁功能的實現SQLServer
- 漏桶、令牌桶限流的Go語言實現Go
- Hive——分桶的理解Hive
- PayPal提現被退回的解決辦法?(教程和費用)
- 用sql實現的n王后SQL
- hive 分割槽表和分桶表區別Hive
- 藿香正氣水和仁丹的區別
- SQL Server 和 MySql 語法和關鍵字的區別ServerMySql
- 用javascript實現較為通用的客戶端分頁元件JavaScript客戶端元件
- [提問交流]有沒有辦法實現以下特別的跳轉效果
- Mysql 分組排序的sql寫法MySql排序
- python 採用pandas的DataFrame實現對數字型別用均值填補和分類型別用眾數填補Python型別
- 一種Mysql和Mongodb資料同步到Elasticsearch的實現辦法和系統MySqlMongoDBElasticsearch
- SQL SERVER 資料庫被標記為“可疑”的解決辦法SQLServer資料庫
- 遞迴和非遞迴分別實現求n的階乘遞迴
- go的令牌桶實現庫 go-rateGo
- 14-宣告和實現的分離
- 棧的應用和實現
- 雲伺服器寶塔皮膚磁碟容量滿了的解決辦法伺服器
- 【清清月兒】用SQL 2005的ROW_NUMBER() 實現分頁功能SQL
- 【丁原】分頁sql中普通寫法和rowid寫法的效能比較SQL
- MYSQL和SQL的區別MySql
- 為SQL Server資料庫傳陣列引數的變通辦法SQLServer資料庫陣列
- SQL Server 2005快速Web分頁的實現SQLServerWeb
- oracle資料庫用sql實現快速分頁Oracle資料庫SQL
- java實現的二分法查詢Java
- 二分法的簡單實現——-遞迴和非遞迴遞迴
- MySQL被慢sql hang住了,用shell指令碼快速清除不斷增長的慢sql的辦法MySql指令碼
- 用切片操作實現的Python篩法Python
- 用原型實現Class的各項語法原型
- 基於vue全家桶實現的簡易商城Vue
- SAP CRM Fiori 應用的 Deep Create 行為和實現分析
- 特效實現用查表法實現對水波的模擬(轉)特效
- MySQL的索引型別和實現原理MySql索引型別
- SQL實現分組limitSQLMIT
- Javascript | 分別用async await非同步方法和Promise來實現一個簡易的求職程式JavaScriptAI非同步Promise求職
- 儲存好的圖片轉為pdf,告訴你手機和電腦分別怎麼實現