問題描述
給你一塊長為x,寬為y的矩形巧克力。你可以對巧克力進行任意次下列操作:
每次操作可以沿一條直線把一塊巧克力切割成兩塊巧克力,要求切出的兩塊巧克力的長和寬都是整數。
問:是否可以經過若干次上述操作,恰好得到n塊面積分別為a1,a2,…,an的巧克力(巧克力要恰好用完,不能夠有剩餘)。如下圖所示,給出你一塊3*4的巧克力,我們可以將其切割成面積為1,2,3,6的四塊巧克力。
輸入格式
第一行,乙個整數n,表示要求切割出的巧克力的塊數。
第二行,兩個整數x和y,表示初始巧克力的長和寬
第三行,n個空格間隔的整數,表示n塊指定的巧克力的面積a1,a2,…,an
輸出格式
一行,若能夠切割成功輸出」yes」,否則輸出」no」
樣例輸入 1
4 3 4
6 3 2 1
樣例輸出 1
yes如果只標記巧克力的面積,會發現資訊量不足。因為可能該面積存在一種合法分割方式,但是這種分割方式已經不能夠用於當前巧克力(比如面積為6的巧克力需要被分成2∗
3 2∗3
,但是現在只有一塊1∗
6 1∗6
的巧克力)。
所以需要再加一維資訊,用來確定巧克力的形狀。
設當前狀態為f[i][x],表示面積為i的巧克力的長為x. 比如對於樣例,面積為
(1010)2
(
1010)2
表示選中了面積為6和2的巧克力。
乙個顯然的結論是:如果乙個矩形能被分成另外兩個同寬或同長的矩形,那麼這個矩形一定存在。所以,當以下兩種情況成立的時候原矩陣能夠切割成功(設寬為y):
①f[k][x]==true && f[i^k][x]==true(k belongs to i)
②f[k][y]==true && f[i^k][y]==true(k belongs to i)
#include
#include
#include
#include
using
namespace
std;
int nn,n,mark[(1
<<15)+5],f[105][(1
<<15)+5],s[20];
int lowbit(int x)
//也可以定成dfs(x,y,s)
bool dfs(int x,int s)
for(int s1=(s-1)&s;s1;s1=(s1-1)&s)
if(mark[s1]%y==0)
if(dfs(min(y,mark[s1]/y),s1))
if(dfs(min(y,mark[s2]/y),s2))
}return0;}
int main()
if(dfs(x,nn))puts("yes");else
puts("no");
return
0;}
1123分享總結
var jsondata function createtree jsons,subnetnode return ul function function factorial num else var truefactorial factorial factorial function alert ...
12 10分享會心得
有幸參加了ucai組織的一場分享會,感覺收穫還是蠻大的,不僅見識到了許多大牛,還獲得了一些學習方法,收穫頗豐!在這裡我見到了php的swoole擴充套件的開發者王晶 半桶水,也見到了熊家貴這樣的android大牛,以及各種ceo和cto。後面也聽了一些優秀者的分享會,感覺他們的經歷都挺傳奇的,日後必...
Openssl EVP 說明三 分享
openssl之evp系列之6 evp encrypt系列函式程式設計架構及例子 在前面的兩篇文章,已經對evp encrypt 系列函式做了詳細的介紹,本章將說明該系列函式通用的應用架構,並舉幾個函式應用例子。應用架構 一般來說,evp encrypt 系列函式的應用架構如下所描述 假設加密演算法...