洛谷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 }
STD

 

以上是关于洛谷P1080国王游戏的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1080 国王游戏

洛谷P1080(NOIP2012)国王游戏——贪心排序与高精度

[NOIP2012] 提高组 洛谷P1080 国王游戏

洛谷P1080 国王游戏 高精度 贪心 数学推公式

洛谷P1080国王游戏

洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]