首页 > 其他 > 详细

【NOIP2012】国王游戏

时间:2019-06-17 21:45:10      阅读:129      评论:0      收藏:0      [点我收藏+]

贪心题,我们使用邻项交换的方法求解。

我们假设当前有两个相邻的人分别为1,2,他们的左右手的数字分别为a,b,假设1之前的人的左手的数字之积为x,那么当前的答案为

技术分享图片

我们将这两个人的位置交换,显然,这两个人位置的交换不会影响其他的人的答案,那么交换后的答案为

技术分享图片

我们假设以上四个数分别为k1,k2,k3,k4,那么显然存在k4>k1,k2>k3

如果我们让交换前的答案更优,那么只需令k2<k4即可,整理,得

 技术分享图片

我们按照这个式子进行排序即可,另外,本题数据较大,我们需要高精度计算。

技术分享图片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 struct peo {
 8     ll l,r;
 9     bool operator <(const peo &x) const  {
10         return l*r<x.l*x.r;
11     }
12 }a[1010];
13 int n;
14 ll ans[100010]={0,1},sum[100010]={0,1},maxx[100010]={0,1};
15 int la=1,ls=1,lm=1;
16 void cheng(ll x) {
17     int tmp=0;
18     for(int i=1;i<=ls;i++)
19         sum[i]*=x;
20     for(int i=1;i<=ls;i++) {
21         tmp+=sum[i];
22         sum[i]=tmp %10;
23         tmp/=10;
24     }
25     while(tmp) {
26         ls++;
27         sum[ls]=tmp%10;
28         tmp/=10;
29     }
30 }
31 void chu(ll x) {
32     memset(maxx,0,sizeof(maxx));
33     lm=ls;
34     int tmp=0;
35     for(int i=lm;i>=1;i--) {
36         tmp*=10;
37         tmp+=sum[i];
38         if(tmp>=x) {
39             maxx[i]=tmp/x;
40             tmp%=x;
41 
42         }
43     }
44     while(maxx[lm]==0) {
45         if(lm==1) return ;
46         lm--;
47     }
48 }
49 void updata() {
50     if(lm>la) {
51         for(int i=1;i<=lm;i++)
52             ans[i]=maxx[i];
53         la=lm;
54         return ;
55     }
56     for(int i=lm;i>=1;i--)
57         if(ans[i]<maxx[i]) {
58             for(int j=1;j<=la;j++) 
59                 ans[j]=maxx[j];
60             return ;
61         }
62 }
63 int main() {
64     scanf("%d",&n);
65     scanf("%lld%lld",&a[0].l,&a[0].r);
66     for(int i=1;i<=n;i++)
67         scanf("%lld%lld",&a[i].l,&a[i].r);
68     sort(a+1,a+n+1);
69     for(int i=1;i<=n;i++) {
70         cheng(a[i-1].l);
71         chu(a[i].r);
72         updata();
73     }
74     for(int i=la;i>=1;i--)
75         printf("%lld",ans[i]);
76     return 0;
77 }
AC Code

 

【NOIP2012】国王游戏

原文:https://www.cnblogs.com/shl-blog/p/11042232.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!