YbtOJ练习:贪心 例题4国王游戏
虽然这道题是一道例题,但是因为它用到了我不大熟悉的高精度算法,所以还是决定写一写。
至于证明过程相信无论是在书上,还是网上,聪明的你都已经知道了。
#include<bits/stdc++.h> using namespace std; const int N=1010; int n,mul[N*4],Div[N*4],ans[N*4],temp[N*4]; struct node { int l,r; bool operator < (const node &G) const { return l*r<G.l*G.r; } }hands[N]; void multify(int x) { for(int i=1;i<=mul[0];i++) mul[i]*=x; for(int i=1;i<=mul[0];i++) { mul[i+1]+=mul[i]/10; mul[i]%=10; } while(mul[mul[0]+1]) { mul[0]++; mul[mul[0]+1]+=mul[mul[0]]/10; mul[mul[0]]%=10; } } void Divide(int x) { memcpy(temp,mul,sizeof(mul)); Div[0]=mul[0]; int t=0; for(int i=temp[0];i;i--) { t=t*10+temp[i]; if(t>=x) { Div[i]=t/x; t%=x; } else Div[i]=0; } while(Div[Div[0]]==0&&Div[0]>1) Div[0]--; } void max() { if(Div[0]>ans[0]) memcpy(ans,Div,sizeof(Div)); for(int i=Div[0];i;i--) if(Div[i]>ans[i]) { memcpy(ans,Div,sizeof(Div)); break; } } void print() { while(ans[ans[0]]==0&&ans[0]>1) ans[0]--; for(int i=ans[0];i;i--) printf("%d",ans[i]); } int main() { scanf("%d",&n); scanf("%d%d",&hands[0].l,&hands[0].r); for(int i=1;i<=n;i++) scanf("%d%d",&hands[i].l,&hands[i].r); sort(hands+1,hands+n+1); mul[0]=1;mul[1]=1; multify(hands[0].l); for(int i=1;i<=n;i++) { Divide(hands[i].r); multify(hands[i].l); max(); } print(); return 0; }