• 【NOIP2012】国王游戏


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

    我们假设当前有两个相邻的人分别为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
  • 相关阅读:
    【性能诊断】十一、性能问题综合分析(案例2,windbg、wireshark)
    SQL Server常用的性能诊断语句
    Oracle常用的性能诊断语句
    【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)
    数据库管理与开发工具推荐---DBeaver
    DM达梦数据库---执行计划查看
    DM达梦数据库索引失效的处理---强制更新统计信息
    jProfiler、jMAT等工具注意设置启动的Xmx参数
    JVM启动参数建议
    Linux环境jcmd抓取进程信息及内存dump
  • 原文地址:https://www.cnblogs.com/shl-blog/p/11042232.html
Copyright © 2020-2023  润新知