[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 }
原文地址:https://www.cnblogs.com/__Kgds/p/9466924.html