切蛋糕(貪心 or 優先佇列)

2022-06-27 05:42:12 字數 1473 閱讀 4472

第一行包括兩個數t,n,表示有n個蛋糕,最小的蛋糕的質量與最大的蛋糕的質量的比值不小於t

接下來n行,每行乙個數wi,表示n個蛋糕的質量

輸出包括一行,為最小切割的刀數

資料保證切割次數不超過500

示例1

0.99 3

2000 3000 4000

6

0.5 < t < 1

1 <= n <= 1000

1 <= wi <= 1000000

題意 :問最小切蛋糕次數,使得所有蛋糕中最小值與最大值的比值大於等於 t

思路分析 :

首先我們要想的乙個問題,蛋糕要怎麼切?

平均切嗎?當然是的,我們要確保的答案是最小值與最大值的比值大於等於 t ,只有當平均切的時候,才能使每塊蛋糕的質量更加集中,才會使這個比值更大。

其次就比較好寫了,2種方法

第一種先對蛋糕質量排序,列舉質量最小的一塊的切的次數,然後從最大的質量的蛋糕往小的判斷即可。

**示例 :

/*

* parasol

*/#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

const int maxn = 1e6+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

double t;

int n;

double pre[1005], a[1005];

int ans = 0;

int sign = 0;

void fun(int x, double mm)

double f = mm/pre[x];

if (f > t || fabs(f-t)p) f = p/mm;

else f = mm/p;

if (f > t || fabs(f-t)1; i--)

else if (p < f)

}else }}

}}int main()

sort(pre+1, pre+1+n);

for(int i = 0; i <= 500; i++)

}

return 0;

}

方法二 、 用優先佇列

將結點定義成

struct node

;

每次從佇列中取出最大值,看一下符不符合題意,不符合就多切一下

優先佇列貪心

最近做了幾個用優先佇列進行貪心的題目,這裡寫下來,以免忘了。1 cf 799 b 每次選最便宜的衣服,沒什麼好說的,一發過 include include include include include define n 6005 define inf 0x3f3f3f3f include incl...

luogu P1714 切蛋糕 單調佇列

單調佇列傻題.考慮以 i 結尾的答案 max sumv sumv j in i m,i 1 sumv 為字首和 稍微搞一搞,發現 sumv 這個是固定的.我們只需維護 min sumv 即可.單調佇列優化一下,每次取隊首即可.code include include includeusing nam...

luogu P1714 切蛋糕 單調佇列

單調佇列傻題.考慮以 i 結尾的答案 max sumv sumv j in i m,i 1 sumv 為字首和 稍微搞一搞,發現 sumv 這個是固定的.我們只需維護 min sumv 即可.單調佇列優化一下,每次取隊首即可.code include include includeusing nam...