時間限制:10000 ms | 記憶體限制:65535 kb
難度:3
描述又是一年acm集訓的時刻,zkc學長邀請n位同學來玩乙個有獎遊戲。首先,他讓每個同學在左、右手上面分別寫下乙個整數,zkc學長自己也在左、右手上各寫乙個整數。然後,讓這n位同學排成一排,zkc學長站在隊伍的最前面。排好隊後,所有的同學都會獲得zkc學長分發的若干肉鬆餅,每位同學獲得的肉鬆餅數分別是:排在該同學前面的所有人的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。
zkc學長不希望某乙個同學獲得特別多的福利,所以他想請你幫他重新安排一下隊伍的順序,使得獲得福利最多的同學,所獲福利盡可能的少。注意,zkc學長的位置始終在隊伍的最前面。
【資料範圍】 對於100%的資料,有1 ≤ n ≤1,000,0 < a、b < 10000。
輸入第一行乙個n表示n個同學
第二行兩個數字代表zkc學長左手和右手的數字
接下來的n行分別代表第n個同學左手和右手的數字
輸出乙個數字代表獲得福利最多同學所獲得福利
樣例輸入
3
1 1
2 3
7 4
4 6
樣例輸出
2
提示按1、2、3號同學這樣排列隊伍,獲得福利最多的同學所獲得肉鬆餅數為2;
按1、3、2這樣排列隊伍,獲得福利最多的同學所獲得肉鬆餅數為2;
按2、1、3這樣排列隊伍,獲得福利最多的同學所獲得肉鬆餅數為2;
按2、3、1這樣排列隊伍,獲得福利最多的同學所獲得肉鬆餅數為9;
按3、1、2這樣排列隊伍,獲得福利最多的同學所獲得肉鬆餅數為2;
按3、2、1這樣排列隊伍,獲得福利最多的同學所獲得肉鬆餅數為9。
因此,福利最多的同學最少獲得2個肉鬆餅,答案輸出2。
分析:
因為人的排的順序不一樣, 最後的結果也不一樣;題上說為讓的到最多肉鬆的人得到的最少,所以很明顯就是貪心, 而這道題貪心的目的就是得到乙個最優的排序。 這就需要我們找到乙個排序的比較函式。
假設對於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 p
a[maxn];
int f[maxn], fs[maxn];
int cmp(p a, p 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<
演算法導論 1 2 1
考慮對陣列a中的n個數的排序 開始時先找出a中的最小元素並放在另乙個陣列b的第乙個位置上。然後找出a衝次最小元素並放在b的第二個位置上,對a中餘下來的元素繼續這個過程。這個演算法稱為選擇排序,請寫出其偽 並以 看不清 形式顯出其最佳和最壞情況下時間代價。static void main string...
1 21 學習報告
第五章中的習題5 3,5 4,5 5 5 5 pointer.cpp 定義控制台應用程式的入口點。include stdafx.h include includeusing namespace std void strcpy 1 char s char t void strcpy 2 char s ...
12 1題目總結
tree poj 1741 給定一棵n 105 個頂點的樹,邊帶正權,問你距離不超過k的頂點對數。點分治陣列維護。bzoj2599 給一棵樹,每條邊有權.求一條路徑,權值和等於k,且邊的數量最小 點分治map維護 bzoj2152 聰聰可可 點分治int維護 hdu4812 給定一棵 n 個點的樹,...