国王游戏(洛谷-P1080)
題目描述
恰逢 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。
思路:高精度!
源代碼
#include<cstdio> #include<iostream> using namespace std; int n; int len=1;//表示高精度中字符串的長度 int a[100010],b[100010],c[100010],g[1000010];//a表示乘積,b表示左手,c表示右手 void multiplicative(int x) {int i;for(i=1;i<=len;i++)g[i]*=b[x];for(i=1;i<=len;i++){g[i+1]+=(g[i]/10);//進(jìn)位g[i]%=10;}len++;while(g[len]>9)//>9的位置上進(jìn)位{g[len+1]+=(g[len]/10);g[len]%=10;len++;}if(g[len]==0)//刪前導(dǎo)0len--; } void division()//高精除 {int i;for(i=len;i>=1;i--){g[i-1]+=((g[i]%c[n])*10);//將前一位%第n位大臣右手給下一位g[i]/=c[n];}while(g[len]==0)//處理首位len--;if(len==0)//防止減完cout<<1<<endl;} void quick_sort(int l,int r) {int i,j,mid;int temp;i=l;j=r;mid=a[(l+r)/2];while(i<=j){while(a[i]<mid) i++;while(a[j]>mid) j--;if(i<=j){temp=a[i],a[i]=a[j],a[j]=temp;temp=b[i],b[i]=b[j],b[j]=temp;temp=c[i],c[i]=a[j],c[j]=temp;i++;j--;}}if(l<j) quick_sort(l,j);if(i<r) quick_sort(i,r); }int main() {int i;cin>>n;cin>>b[0]>>c[0];for(i=1;i<=n;i++){cin>>b[i]>>c[i];//輸入每人左右手的金幣數(shù)a[i]=b[i]*c[i];//兩手金幣數(shù)相乘}quick_sort(1,n);//從第一位大臣處開始排序g[1]=b[0];//從國王左手開始乘,賦初值for(i=1;i<n;i++) //所有左手的數(shù)字相乘multiplicative(i);division();//最后一個(gè)得到的最多,所以由n-1個(gè)左手乘積/第n個(gè)右手乘積for(i=len;i>=1;i--)//倒序輸出cout<<g[i];return 0; }?
總結(jié)
以上是生活随笔為你收集整理的国王游戏(洛谷-P1080)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划 —— 背包问题 P05 ——
- 下一篇: Less or Equal(CF-977