https://www.luogu.org/problemnew/show/P1080 題目描述 恰逢 H 國國慶,國王邀請 n位大臣來玩一個有獎游戲。首先,他讓每個大臣在左、右手上面分別寫下一個整數,國王自己也在左、右手上各寫一個整數。然后,讓這 n 位大臣排成一排,國王站在隊伍的最前面。排好隊后,所有的大臣都會獲得國王獎賞的若干金幣,每位大臣獲得的金幣數分別是:排在該大臣前面的所有人的左手上的數的乘積除以他自己右手上的數,然后向下取整得到的結果。
#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;//乘積小的排在前面}};voidmulti(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];}}voiddivs(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){returnstrcmp(a,b)>0;}return lena > lenb;}intmain(){//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;return0;}