洛谷P1080 國王遊戲
題目描述
恰逢 HH H國國慶,國王邀請n nn 位大臣來玩一個有獎遊戲。首先,他讓每個大臣在左、右手上面分別寫下一個整數,國王自己也在左、右手上各寫一個整數。然後,讓這 nnn 位大臣排成一排,國王站在隊伍的最前面。排好隊後,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然後向下取整得到的結果。
國王不希望某一個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,使得獲得獎賞最多的大臣,所獲獎賞儘可能的少。注意,國王的位置始終在隊伍的最前面。
輸入輸出格式
輸入格式:
第一行包含一個整數n nn,表示大臣的人數。
第二行包含兩個整數 aaa和 bbb,之間用一個空格隔開,分別表示國王左手和右手上的整數。
接下來 nn n行,每行包含兩個整數a aa 和 bbb,之間用一個空格隔開,分別表示每個大臣左手和右手上的整數。
輸出格式:
一個整數,表示重新排列後的隊伍中獲獎賞最多的大臣所獲得的金幣數。
輸入輸出樣例
輸入樣例#1:
3 1 1 2 3 7 4 4 6
輸出樣例#1:
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。
【資料範圍】
對於 20%的資料,有 1≤n≤10,0<a,b<;
對於 40%的資料,有1≤n≤20,0<a,b<8;
對於 60%的資料,有 1≤n≤100;
對於 60%的資料,保證答案不超過 10^9;
對於 100%的資料,有 1≤n≤1,000, 0<a,b<10000。
NOIP 2012 提高組 第一天 第二題
誰能想到這竟然是一道貪心題?!noip簡直太邪惡了。。。
這道題需要把大臣們按照a[i]*b[i]的值從小到大排序,然後依次比較求出此時的最大值就行了
如果要拿100分的話要寫一個高精度,像我這種菜雞隻寫了60分的樸素程式碼就打算溜了
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,ans = 0;
struct node{
int l,r,p;
}a[10003];
bool cmp(node x,node y)
{
return x.p < y.p;
}
int main()
{
scanf("%d%d%d",&n,&a[0].l,&a[0].r);
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
a[i].p = a[i].r * a[i].l;
}
sort(a + 1,a + n + 1,cmp);
int s = 1;
for(int i = 1;i <= n;i++)
{
s *= a[i - 1].l;
int q = s/a[i].r;
ans = max(ans,q);
}
printf("%d",ans);
return 0;
}