• [NOIp2012提高组]国王游戏


    [NOIp2012提高组_Day1T2]国王游戏

      1 #include<iostream>
      2 #include<string.h>
      3 #include<algorithm>
      4 #include<stdio.h>
      5 #define N 10000
      6 using namespace std;
      7 struct Big_Number
      8 {
      9     int a[N+10];
     10     Big_Number()
     11     {
     12         memset(a,0,sizeof(a));
     13         a[0]=1;
     14     }
     15     Big_Number(int n)
     16     {
     17         memset(a,0,sizeof(a));
     18         a[0]=0;
     19         while(n)
     20         {
     21             a[++a[0]]=n%10;
     22             n/=10;
     23         }
     24         if(!a[0])
     25             a[0]=1;
     26     }
     27     Big_Number(char *s)
     28     {
     29         memset(a,0,sizeof(a));
     30         int len=strlen(s);
     31         for(int i=1;i<=len;i++)
     32             a[i]=s[len-i]-'0';
     33         a[0]=len;
     34     }
     35     Big_Number operator*(const Big_Number &b)const
     36     {
     37         Big_Number c;
     38         int i,j,len=a[0]+b.a[0];
     39         for(i=1;i<=a[0];i++)
     40             for(j=1;j<=b.a[0];j++)
     41                 c.a[i+j-1]+=a[i]*b.a[j];
     42         for(i=1;i<len;i++){
     43             c.a[i+1]+=c.a[i]/10;
     44             c.a[i]%=10;
     45         }
     46         while(len>1&&!c.a[len])
     47             len--;
     48         c.a[0]=len;
     49         return c;
     50     }
     51     Big_Number operator/(int b)const
     52     {
     53         Big_Number c;
     54         int d=0,i,len=a[0];
     55         for(i=a[0];i;i--){
     56             d=d*10+a[i];
     57             c.a[i]=d/b;
     58             d%=b;
     59         }
     60         while(len>1&&!c.a[len])
     61             len--;
     62         c.a[0]=len;
     63         return c;
     64     }
     65     Big_Number operator+(const Big_Number &b)const
     66     {
     67         Big_Number c;
     68         int len=max(a[0],b.a[0]),i;
     69         for(i=1;i<=len;i++){
     70             c.a[i]+=a[i]+b.a[i];
     71             c.a[i+1]=c.a[i]/10;
     72             c.a[i]%=10;
     73         }
     74         len++;
     75         while(len>1&&!c.a[len])
     76             len--;
     77         c.a[0]=len;
     78         return c;
     79     }
     80     Big_Number operator-(const Big_Number &b)const
     81     {
     82         Big_Number c;
     83         int i,len=a[0];
     84         for(i=1;i<=len;i++)
     85         {
     86             c.a[i]+=a[i]-b.a[i];
     87             if(c.a[i]<0)c.a[i]+=10,c.a[i+1]--;
     88         }
     89         while(len>1&&!c.a[len])len--;
     90         c.a[0]=len;
     91         return c;
     92     }
     93     void operator*=(const Big_Number &x){*this=*this*x;}
     94     void operator/=(const int &x){*this=*this/x;}
     95     void operator+=(const Big_Number &x){*this=*this+x;}
     96     void operator-=(const Big_Number &x){*this=*this-x;}
     97     void print(){
     98         for(int i=a[0];i;i--)
     99             printf("%d",a[i]);
    100     }
    101     bool operator>(const Big_Number&b)const
    102     {
    103         if(a[0]>b.a[0])
    104             return 1;
    105         if(a[0]<b.a[0])
    106             return 0;
    107         for(int i=a[0];i;i--)
    108             if(a[i]>b.a[i])
    109                 return 1;
    110             else if(a[i]<b.a[i])
    111                 return 0;
    112         return 0;
    113     }
    114     bool operator<(const Big_Number&b)const
    115     {
    116         if(a[0]<b.a[0])
    117             return 1;
    118         if(a[0]>b.a[0])
    119             return 0;
    120         for(int i=a[0];i;i--)
    121             if(a[i]<b.a[i])
    122                 return 1;
    123             else if(a[i]>b.a[i])
    124                 return 0;
    125         return 0;
    126     }
    127     bool operator<=(const Big_Number&b)const{return !(*this>b);}
    128     Big_Number operator/(const Big_Number&b)const
    129     {
    130         Big_Number l(0),r(*this),mid;
    131         while(l<r)
    132         {
    133             mid=(l+r+1)/2;
    134             if(mid*b<=*this) l=mid;
    135             else r=mid-1;
    136         }
    137         return l;
    138     }
    139     void operator/=(const Big_Number&b){*this=*this/b;}
    140 };
    141 struct node{int Left,Right;long long Product;};
    142 inline int read()
    143 {
    144     int sign=1,num=0;
    145     char ch=getchar();
    146     while(!isdigit(ch)){if(ch=='-')sign=-1;ch=getchar();}
    147     while(isdigit(ch)){num=num*10+(ch-'0');ch=getchar();}
    148     return sign*num;
    149 }
    150 bool comp(node x,node y)
    151 {
    152     return x.Product<y.Product;
    153 }
    154 int main()
    155 {
    156     int n=read();
    157     Big_Number ans(1);
    158     node f[N+10];
    159     f[0].Left=read();
    160     f[0].Right=read();
    161     for(int i=1;i<=n;++i)
    162     {
    163         f[i].Left=read();
    164         f[i].Right=read();
    165         f[i].Product=f[i].Left*f[i].Right;
    166     }
    167     sort(f+1,f+n+1,comp);
    168     for(int i=1;i<=n;++i)
    169         ans*=f[i-1].Left;
    170     ans/=f[n].Right;
    171     if(ans<1)ans=1;
    172     ans.print();
    173 }
  • 相关阅读:
    wikiquote
    zz 勵志貼,成功是努力加对的方向
    # 电纸书
    # 崔寶秋
    好的程序員
    深度学习引擎
    再见乱码:5分钟读懂MySQL字符集设置
    Linux基础:用tcpdump抓包
    Linux基础:文件查找find
    Linux基础:xargs命令
  • 原文地址:https://www.cnblogs.com/__Kgds/p/9466924.html
Copyright © 2020-2023  润新知