日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1080 国王游戏

發(fā)布時(shí)間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1080 国王游戏 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

恰逢 H 國國慶,國王邀請(qǐng) n 位大臣來玩一個(gè)有獎(jiǎng)游戲。首先,他讓每個(gè)大臣在左、右手上面分別寫下一個(gè)整數(shù),國王自己也在左、右手上各寫一個(gè)整數(shù)。然后,讓這 n 位大臣排成一排,國王站在隊(duì)伍的最前面。排好隊(duì)后,所有的大臣都會(huì)獲得國王獎(jiǎng)賞的若干金幣,每位大臣獲得的金幣數(shù)分別是:排在該大臣前面的所有人的左手上的數(shù)的乘積除以他自己右手上的數(shù),然后向下取整得到的結(jié)果。

國王不希望某一個(gè)大臣獲得特別多的獎(jiǎng)賞,所以他想請(qǐng)你幫他重新安排一下隊(duì)伍的順序,使得獲得獎(jiǎng)賞最多的大臣,所獲獎(jiǎng)賞盡可能的少。注意,國王的位置始終在隊(duì)伍的最前面。

輸入輸出格式

輸入格式:

?

第一行包含一個(gè)整數(shù) n,表示大臣的人數(shù)。

第二行包含兩個(gè)整數(shù) a和 b,之間用一個(gè)空格隔開,分別表示國王左手和右手上的整數(shù)。

接下來 n 行,每行包含兩個(gè)整數(shù) a 和 b,之間用一個(gè)空格隔開,分別表示每個(gè)大臣左手和右手上的整數(shù)。

?

輸出格式:

?

輸出只有一行,包含一個(gè)整數(shù),表示重新排列后的隊(duì)伍中獲獎(jiǎng)賞最多的大臣所獲得的金幣數(shù)。

?

輸入輸出樣例

輸入樣例#1:
3 1 1 2 3 7 4 4 6 輸出樣例#1:
2

說明

【輸入輸出樣例說明】

按 1、2、3 號(hào)大臣這樣排列隊(duì)伍,獲得獎(jiǎng)賞最多的大臣所獲得金幣數(shù)為 2;

按 1、3、2 這樣排列隊(duì)伍,獲得獎(jiǎng)賞最多的大臣所獲得金幣數(shù)為 2;

按 2、1、3 這樣排列隊(duì)伍,獲得獎(jiǎng)賞最多的大臣所獲得金幣數(shù)為 2;

按 2、3、1 這樣排列隊(duì)伍,獲得獎(jiǎng)賞最多的大臣所獲得金幣數(shù)為 9;

按 3、1、2 這樣排列隊(duì)伍,獲得獎(jiǎng)賞最多的大臣所獲得金幣數(shù)為 2;

按 3、2、1 這樣排列隊(duì)伍,獲得獎(jiǎng)賞最多的大臣所獲得金幣數(shù)為 9。

因此,獎(jiǎng)賞最多的大臣最少獲得 2 個(gè)金幣,答案輸出 2。

【數(shù)據(jù)范圍】

對(duì)于 20%的數(shù)據(jù),有 1≤ n≤ 10,0 < a、b < 8;

對(duì)于 40%的數(shù)據(jù),有 1≤ n≤20,0 < a、b < 8;

對(duì)于 60%的數(shù)據(jù),有 1≤ n≤100;

對(duì)于 60%的數(shù)據(jù),保證答案不超過 10^9;

對(duì)于 100%的數(shù)據(jù),有 1 ≤ n ≤1,000,0 < a、b < 10000。

NOIP 2012 提高組 第一天 第二題

?

?

不想寫高精.jpg.

思路很簡單,就是把a(bǔ)*b從小到大排序

1.證明:

1)知道,如果相鄰的兩個(gè)人交換位置,只會(huì)影響到這兩個(gè)人的值,不會(huì)影響他人

2)假設(shè)相鄰的兩個(gè)人i, i + 1。設(shè)A[i]?B[i] <= A[i + 1]?B[i + 1],i之前所有人的左手乘積為S。

則,ans1 = max{S / B[i], S * A[i] / B[i + 1]}

若交換

則,ans2 = max{S / B[i + 1], S * A[i + 1] / B[i]}

因?yàn)?#xff0c;A[i]?B[i] <= A[i + 1]?B[i + 1]

所以,S?A[i] / B[i + 1] <= S?A[i + 1] / B[i]

又因?yàn)?#xff0c;S / B[i + 1] <= S * A[i] / B[i + 1]

所以,ans2 = S * A[i + 1] / B[i]

ans1 = max{S / B[i], S * A[i] / B[i + 1]}

所以,ans1 <= ans2

2.證明:

取 log 變成加法.

其實(shí)只與相鄰兩人的順序有關(guān).
前后的人他們都影響不了.
推一推式子. 假設(shè)有倆人 i,j.
i 在 j 前面的答案是
max{?b i ,a i ? b j }
i 在 j 后面的答案是
max{?b j ,a j ? b i }

顯然 ?b j < a i ? b j ,?b i < a j ? b i .
所以 a i ? b j < a j ? b i .
所以 a i + b i < a j + b j

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<queue> 7 #define lli long long int 8 using namespace std; 9 const lli MAXN=1001; 10 inline void read(lli &n) 11 { 12 char c='+';lli x=0;bool flag=0; 13 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} 14 while(c>='0'&&c<='9'){x=x*10+(c-48);c=getchar();} 15 flag==1?n=-x:n=x; 16 } 17 struct node 18 { 19 lli a,b; 20 node(){a=0;b=0;} 21 }pep[MAXN]; 22 lli comp(const node &a,const node &b) 23 { 24 return (a.a*a.b<b.a*b.b); 25 } 26 lli now=1; 27 lli ans=0; 28 int main() 29 { 30 lli n; 31 read(n); 32 read(pep[1].a);read(pep[1].b); 33 for(lli i=2;i<=n+1;i++){read(pep[i].a);read(pep[i].b);} 34 sort(pep+2,pep+n+2,comp); 35 for(lli i=1;i<=n+1;i++) 36 { 37 ans=max(ans,now/(pep[i].b)); 38 now*=pep[i].a; 39 } 40 //printf("%lld",ans); 41 cout<<ans; 42 return 0; 43 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/zwfymqz/p/7297446.html

總結(jié)

以上是生活随笔為你收集整理的P1080 国王游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。