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

2021-09-10 22:42:51 字數 1757 閱讀 1514

原題

題解

這個國王太會玩了!!

【題意分析】

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

然後就開始了玄妙的數學證明時間!!

前方高能!!!前方高能

【證明】

…(設這一段乘積為x1) …(設這一段乘積為y2)

l1 r1

…(設這一段乘積為x2) …(設這一段乘積為y2)

l2 r2

由上面這張**可以知道這樣的情況時:

第一個人所得的金幣數為x1/r1;

第二個人所得的金幣數為x1×l1×x2/r2;

所以最小值為 max(x1/r1, x1×l1×x2/r2);

然後交換兩個人的位置

…(這一段乘積為x1) …(這一段乘積為y2)

l2 r2

…(這一段乘積為x2) …(這一段乘積為y2)

l1 r1

由上面這張**可以知道交換後的情況時:

第一個人所得的金幣數為x1×l2×x2/r1;

第二個人所得的金幣數為x1/r2;

所以此時最小值為max(x1×l2×x2/r1, x1/r2);

綜合上面兩種情況:

如果變換之前的情況要優於變換之後的情況,那麼

max(x1/r1, x1×l1×x2/r2) < max(x1×l2×x2/r1, x1/r2);

而x1/r1 < x1×l2×x2/r1 恆成立;

x1×l1×x2/r2 > x1/r2;

所以上述條件成立時

必須有x1×l1×x2/r2 < x1×l2×x2/r1 恆成立;所以化簡可得 l1×r1 < l2×r2恆成立。

int n, lens = 1, lenm = 1, lena = 1;//重要的初始化

int sum[10010] = , maxn[10010] = , ans[10010];//重要的初始化

//ans是高精度除法的儲存陣列,sum是高精度乘法的儲存陣列

struct tmp

}coin[1001];

void muti(long long x)//高精度乘法 求累積

//進製過程

while(tmp != 0)

//增加位數

}void cut(long long x)//高精度除法求每個大臣的獎賞

}while(ans[lena] == 0)//去掉多餘的0

}void max()

else if(lena == lenm)

}}int main()

for(int i = lenm; i >= 1; i--) cout << maxn[i];//高精度要求倒著輸出

}

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

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

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

分析 因為人的排的順序不一樣,最後的結果也不一樣 題上說為讓的到最多肉鬆的人得到的最少,所以很明顯就是貪心,而這道題貪心的目的就是得到乙個最優的排序。這就需要我們找到乙個排序的比較函式。假設對於a,b兩人以前的順序已經排好,現在的問題就是a,b的順序。設前面所有人左手乘積為t 如果a在前,a得到的肉...

帶小數的高精度除法(除以低精度數)

1 2 3code instruction45 coding by kaka ricochet simpson67 greatintcal.8 9 10 define maxl 1000 11 include 12 include 13void intcpy int a,int b 14 void ...