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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

国王游戏

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 国王游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description
恰逢H國國慶,國王邀請n位大臣來玩一個有獎游戲。首先,他讓每個大臣在左、右

手上面分別寫下一個整數,國王自己也在左、右手上各寫一個整數。然后,讓這n位大臣排

成一排,國王站在隊伍的最前面。排好隊后,所有的大臣都會獲得國王獎賞的若干金幣,每

位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右

手上的數,然后向下取整得到的結果。

國王不希望某一個大臣獲得特別多的獎賞,所以他想請你幫他重新安排一下隊伍的順序,

使得獲得獎賞最多的大臣,所獲獎賞盡可能的少。注意,國王的位置始終在隊伍的最前面。

Input
輸入文件為game.in。

第一行包含一個整數n,表示大臣的人數。

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

接下來n行,每行包含兩個整數a和b,之間用一個空格隔開,分別表示每個大臣左手

和右手上的整數。

Output
輸出文件名為game.out。

輸出只有一行,包含一個整數,表示重新排列后的隊伍中獲獎賞最多的大臣所獲得的

金幣數。

Sample Input
3
1 1
2 3
7 4
4 6

Sample Output
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。

Data Constraint

Hint
對于20%的數據,有1≤ n≤ 10,0 < a、b < 8;
對于40%的數據,有1≤ n≤20,0 < a、b < 8;
對于60%的數據,有1≤ n≤100;
對于60%的數據,保證答案不超過10^9;
對于100%的數據,有1 ≤ n ≤1,000,0 < a、b < 10000。

.
.
.
.
.
.
分析
設緊挨著的兩個人a,b的左右手數字分別為La,Lb,Ra,Rb,設a和b前面的所有人的左手的數字的乘積為S,可以發現,交換ab的順序不會影響ab前面所有人得到的金幣數,也不會影響ab后面所有人得到的金幣數目,那么可以假設讓a排在b前面比讓b排在a前面的結果更優:

a在b前時:
a獲得的金幣數為:S/Ra ———– #1
b獲得的金幣數為:SLa/Rb ———–#2
b在a前時:
a獲得的金幣數為:SLb/Ra ———–#3
b獲得的金幣數為:S/Rb ————#4

那么要想讓假設成立,就必須有:max(#1 , #2) < max(#3 , #4)———#5
很明顯可以看出,#1 < #3 ,# < #4
如果要#5成立,還必須有#3 > #2 ,即 SLb/Ra > SLa/Rb
化簡得到:LbRb > LaRa
所以得到左右手數字乘積小的排在前面會使得結果更優。

最后,要用高精計算。

.
.
.
.
.
程序:

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[20000],b[20000],w[20000],d[20000],maxx[100000],len,f,maxxlen,a1[100000],a2[100000]; char str[100000];void kp(int l,int r) {if (l>r) return;int i=l,j=r,mid=w[(l+r)/2];do {while (w[i]<mid) i++;while (w[j]>mid) j--;if (i<=j){a[0]=a[i];a[i]=a[j];a[j]=a[0];b[0]=b[i];b[i]=b[j];b[j]=b[0];w[0]=w[i];w[i]=w[j];w[j]=w[0];i++;j--;}}while (i<=j);kp(l,j);kp(i,r); }void cheng(int a[],int b) {memset(d,0,sizeof(d));for(int i=1;i<=len;i++) d[i]=a[i]*b;for (int i=1;i<=len;i++)if (d[i]/10){d[i+1]+=d[i]/10;d[i]%=10;}while (d[len+1]) len++;while (d[len]/10){d[len+1]+=d[len]/10;d[len]%=10;len++;}for (int i=1;i<=len;i++) a[i]=d[i]; }void chu(int a[],int b) {memset(d,0,sizeof(d)); int x=0;for(int i=1;i<=len;i++){d[i]=(a[i]+x*10)/b;x=(a[i]+x*10)%b;}int pd=0;for (int i=1;i<=len;i++)if (d[i]!=0){pd=1;break;}if (pd!=0){int i=1;while (d[i]==0) i++;f=i;while (i<=len){if (d[i]>maxx[i]&&len-f+1==maxxlen||len-f+1>maxxlen){for (int j=f;j<=len;j++) maxx[j]=d[j];maxxlen=len-f+1;break;}if (maxxlen>len-f+1||d[i]<maxx[i]) break;i++;}} }int main() {int n,aa,bb;scanf("%d",&n);scanf("%d%d",&aa,&bb);for (int i=1;i<=n;i++){scanf("%d%d",&a[i],&b[i]);w[i]=a[i]*b[i];}kp(1,n);int i=0;while (aa!=0){str[i]=aa%10+'0';aa/=10;i++;}len=strlen(str);for (int i=1;i<=len;i++) a1[i]=str[i-1]-'0';for (int i=1;i<=len;i++) a2[i]=str[len-i]-'0';for (int i=1;i<=n;i++){chu(a2,b[i]);cheng(a1,a[i]);for (int j=1;j<=len;j++) a2[j]=a1[len-j+1];}for (int i=f;i<=maxxlen+f-1;i++) cout<<maxx[i];return 0; }

轉載于:https://www.cnblogs.com/YYC-0304/p/10292780.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。