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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P1080 国王游戏(贪心+高精度乘除及大数比较)

發布時間:2024/9/3 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1080 国王游戏(贪心+高精度乘除及大数比较) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://www.luogu.org/problemnew/show/P1080
題目描述
恰逢 H 國國慶,國王邀請 n位大臣來玩一個有獎游戲。首先,他讓每個大臣在左、右手上面分別寫下一個整數,國王自己也在左、右手上各寫一個整數。然后,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊后,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然后向下取整得到的結果。

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

輸入輸出格式
輸入格式:
第一行包含一個整數 n,表示大臣的人數。

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

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

輸出格式:
一個整數,表示重新排列后的隊伍中獲獎賞最多的大臣所獲得的金幣數。

輸入輸出樣例
輸入樣例#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 < 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。

NOIP 2012 提高組 第一天 第二題
Ac_code:
/*
舉個栗子:

3 1 1 2 100 3 50 4 1

栗子加…推理得出乘積小的應該排在前面,再加上乘積值最大將近10^4000
所以還要高精度計算`!
*/

#include <iostream> #include <algorithm> #include <string.h> using namespace std; char aim[4500],temp[4500]; char c1[4500],c2[4500],ans[4500]; struct person {int r;int l;bool operator<(const person &x)const{return l*r < x.l*x.r;//乘積小的排在前面} }; void multi(char tmp[],int x)//乘法 {int len = strlen(tmp),t,y;int k = 1,s = 0;memset(aim,'\0',sizeof(aim));while(x){t = x%10;y = 0;k = s;for(int i = len-1; i>=0; i--){int p = (tmp[i]-'0')*t + y;if(aim[k]=='\0') aim[k] = '0';y = (aim[k]-'0' + p)/10;aim[k] = (aim[k]-'0' + p)%10+'0';k++;}if(y) aim[k++] = y+'0';++s;x /= 10;}for(int i = k-1,j = 0; i >= 0; i--){tmp[j++] = aim[i];} } void divs(char *tmp,int x)//除法 {int len = strlen(tmp);memset(c1,'\0',sizeof(c1));int k = 0;int num = 0;for(int i = 0; i < len; i++){num = num*10+(tmp[i]-'0');if(num >= x){c1[k] = num / x+'0';num = num % x;}else{c1[k] = '0';}k++;}int s = 0;while(c1[s]=='0')s++;memset(c2,'\0',sizeof(c2));if(s==k){c2[0] = '0';}else{strcpy(c2,c1+s);} } bool cmp(char *a,char *b)//大數比較 {int lena = strlen(a),lenb = strlen(b);if(lena == lenb){return strcmp(a,b)>0;}return lena > lenb; } int main() {//std::ios::sync_with_stdio(0);//cin.tie(0);int n;cin>>n;person a[n+2];for(int i = 0; i <= n; i++){cin>>a[i].l>>a[i].r;}sort(a+1,a+n+1);temp[0] = '1';ans[0] = '0';for(int i = 1; i <= n; i++){multi(temp ,a[i-1].l);divs(temp,a[i].r);if(!cmp(ans,c2)){strcpy(ans,c2);}}cout<<ans<<endl;return 0; }

總結

以上是生活随笔為你收集整理的P1080 国王游戏(贪心+高精度乘除及大数比较)的全部內容,希望文章能夠幫你解決所遇到的問題。

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