NYOJ zkc學長的福利 貪心 高精度運算

2021-07-04 03:33:46 字數 1007 閱讀 4038

分析:

因為人的排的順序不一樣, 最後的結果也不一樣;題上說為讓的到最多肉鬆的人得到的最少,所以很明顯就是貪心, 而這道題貪心的目的就是得到乙個最優的排序。  這就需要我們找到乙個排序的比較函式。

假設對於a,b兩人以前的順序已經排好, 現在的問題就是a, b的順序。 設前面所有人左手乘積為t; 如果a在前,a得到的肉鬆餅的個數為 t/a2,  b的到的個數為(t*a1)/b2; 如果b在前, 那麼a的到的就是(t*b1)/a2, b得到的個數就是t/b2;

現在的目標就讓兩者的最大值去最小; 現在我們發現t是對結果沒影響的。 所以顯而易見就是對a1/b2  和 b1/a2 求最小。  如果我們讓a排在b前面, 那麼就是a1/b2 < b1/a2, 化簡就是a1*a2 < b1*b2 , 所以我們就的到了排序的比較函式。

下面就高精度的問題了, 這是我第一次寫這樣高精度的題, 寫個模板,方便用。也是為了紀念一下。

#include#include#include#includeusing namespace std;

const int maxn = 1010;

struct info

a[maxn];

int f[maxn], fs[maxn];

int cmp(const info& a, const info& b)

int main()

si = i;

}t = t * a[i].l;

m = 0;

for(int j = 0; j <= 999; j++)

}m = 0;

for(int j = 999; j >= 0; j--)

{if(m == 1)

{if(fs[j] < 10)

cout<<"000";

else if(fs[j] < 100)

cout<<"00";

else if(fs[j] < 1000)

cout<<"0";

cout<0)

{m = 1;

cout<

NYOJ 1218 zkc學長的福利

時間限制 10000 ms 記憶體限制 65535 kb 難度 3 描述又是一年acm集訓的時刻,zkc學長邀請n位同學來玩乙個有獎遊戲。首先,他讓每個同學在左 右手上面分別寫下乙個整數,zkc學長自己也在左 右手上各寫乙個整數。然後,讓這n位同學排成一排,zkc學長站在隊伍的最前面。排好隊後,所有...

國王的遊戲(貪心 高精度)

恰逢 h 國國慶,國王邀請 n 位大臣來玩乙個有獎遊戲。首先,他讓每個大臣在左 右手上面分別寫下乙個整數,國王自己也在左 右手上各寫乙個整數。然後,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是 排在該大臣前面的所有人的左手...

帶數學推導的貪心(高精度乘除法應用)

原題 題解 這個國王太會玩了!題意分析 首先,由於乙個大臣所獲得的金幣數隻取決於他右手的金幣數,所以前面的大臣順序並不影響後面大臣的金幣數,但會影響自己手中的金幣數。然後便想到了貪心。但發現這樣子並不能得出最優解。然後經過一番推導,便可以得知乙個大臣的左右手乘積越大,就越要放到隊伍後面。然後就開始了...