洛谷P1080国王游戏
Posted Absolutezero
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1080国王游戏相关的知识,希望对你有一定的参考价值。
我们按照左右手数的乘积升序排序,就能使最多金币数最小了
为什么呢?
我们知道:
1)如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人
2)假设相邻的两个人i, i + 1。设A[i] B[i] <= A[i + 1] B[i + 1],i之前所有人的左手乘积为S。
ans1 = max{S / B[i], S * A[i] / B[i + 1]}
ans2 = max{S / B[i + 1], S * A[i + 1] / B[i]}
因为,A[i] B[i] <= A[i + 1] B[i + 1]
所以,S A[i] / B[i + 1] <= S A[i + 1] / B[i]
又因为,S / B[i + 1] <= S * A[i] / B[i + 1]
所以,ans2 = S * A[i + 1] / B[i]
ans1 = max{S / B[i], S * A[i] / B[i + 1](<=S A[i + 1] / B[i])}
所以,ans1 <= ans2
高精度10,0000进制
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=50010,p=100000; 6 int s[N],a[N],tmp[N],ans; 7 int len,n,lens; 8 struct fx{ 9 int l,r,x; 10 }d[1010]; 11 bool cmp(fx a,fx b){ 12 return a.x<b.x; 13 } 14 int check(){ 15 if (len>lens) 16 return 1; 17 for (int i=1;i<=len;i++) 18 if (s[i]<tmp[i]) 19 return 1; 20 return 0; 21 } 22 void M(int x){ 23 int t=0; 24 for (int i=1;i<=len;i++){ 25 a[i]=t+a[i]*x; 26 t=a[i]/p; 27 a[i]%=p; 28 } 29 if (t) 30 a[++len]=t; 31 } 32 void D(int y){ 33 int i=len,l=0,x=a[len]; 34 while (i){ 35 if (i>1){ 36 if (x<y) 37 x=x*p+a[--i]; 38 } 39 else 40 break; 41 tmp[++l]=x/y; 42 x%=y; 43 } 44 if (x>=y) 45 tmp[++l]=x/y; 46 if (check()){ 47 lens=l; 48 for (int i=1;i<=l;i++) 49 s[i]=tmp[i]; 50 } 51 } 52 void print(){ 53 printf("%d",s[1]); 54 for (int i=2;i<=lens;i++) 55 if (s[i]>10000) 56 printf("%d",s[i]); 57 else if (s[i]>1000) 58 printf("0%d",s[i]); 59 else if (s[i]>100) 60 printf("00%d",s[i]); 61 else if (s[i]>10) 62 printf("000%d",s[i]); 63 else printf("0000%d",s[i]); 64 } 65 int main(){ 66 ans=lens=0; 67 scanf("%d",&n); 68 for (int i=0;i<=n;i++){ 69 scanf("%d %d",&d[i].l,&d[i].r); 70 d[i].x=d[i].l*d[i].r; 71 } 72 sort(d+1,d+n+1,cmp); 73 len=1; 74 a[1]=1; 75 for (int i=1;i<=n;i++){ 76 M(d[i-1].l); 77 D(d[i].r); 78 } 79 print(); 80 return 0; 81 }
以上是关于洛谷P1080国王游戏的主要内容,如果未能解决你的问题,请参考以下文章