贪心加高精
#include<bits/stdc++.h>
using namespace std;
struct big
{
vector<int> s;
static const int BASE=1000000;
static const int WIDTH=6;
void standardize()
{
for(int i=s.size()-1;i>=0;--i)
{
if(s[i]==0)
s.pop_back();
else
break;
}
if(s.empty())
s.push_back(0);
}
big& operator = (long long num)
{
s.clear();
do
{
s.push_back(num%BASE);
num/=BASE;
}while(num>0);
return *this;
}
big& operator = (const string& num)
{
s.clear();
int len=(num.size()-1)/WIDTH+1;
int x=0;
for(int i=0;i<len;++i)
{
int end=num.size()-i*WIDTH;
int start=max(0,end-WIDTH);
sscanf(num.substr(start,end-start).c_str(),"%d",&x);
s.push_back(x);
}
standardize();
return *this;
}
big operator + (const big& rhs) const
{
int size=max(s.size(),rhs.s.size());
int carry=0;
big ans;
for(int i=0;i<size;++i)
{
int sum=carry;
if(i<s.size()) sum+=s[i];
if(i<rhs.s.size()) sum+=rhs.s[i];
carry=sum/BASE;
ans.s.push_back(sum%BASE);
}
if(carry>0)
{
ans.s.push_back(carry);
}
return ans;
}
big operator * (const big& rhs) const
{
big ans;
for(int i=0;i<rhs.s.size();++i)
{
big lans;
for(int k=0;k<i;++k) lans.s.push_back(0);
int carry=0;
for(int j=0;j<s.size();++j)
{
int result=rhs.s[i]*s[j]+carry;
carry=result/BASE;
lans.s.push_back(result%BASE);
}
while(carry>0)
{
lans.s.push_back(carry%BASE);
carry/=BASE;
}
ans=ans+lans;
}
return ans;
}
big operator - (const big& rhs) const
{
big ans;
int carry=0;
for(int i=0;i<s.size();++i)
{
int diff=s[i]-carry;
if(i<rhs.s.size()) diff-=rhs.s[i];
carry=0;
while(diff<0)
{
++carry;
diff+=BASE;
}
ans.s.push_back(diff);
}
ans.standardize();
return ans;
}
big operator / (int rhs) const
{
big ans;
vector<int> t;
long long rmder=0;
for(int i=s.size()-1;i>=0;--i)
{
long long temp=rmder*BASE+s[i];
long long div=temp/rhs;
rmder=temp%rhs;
t.push_back(div);
}
for(int i=t.size()-1;i>=0;--i)
ans.s.push_back(t[i]);
ans.standardize();
return ans;
}
friend ostream& operator << (ostream& out,const big& rhs)
{
out<<rhs.s.back();
for(int i=rhs.s.size()-2;i>=0;--i)
{
char buf[10];
sprintf(buf,"%06d",rhs.s[i]);
cout<<string(buf);
}
return out;
}
bool operator < (const big& rhs) const
{
if(s.size()!=rhs.s.size()) return s.size()<rhs.s.size();
for(int i=s.size()-1;i>=0;--i)
{
if(s[i]!=rhs.s[i])
return s[i]<rhs.s[i];
}
return false;
}
};
int n;
big sum[1006],ans[1006],max1;
struct r
{
long long lift;
long long right;
};
r king,da[1006];
bool compare(r a,r b)
{
return a.lift*a.right<b.lift*b.right;
}
int main()
{
cin>>n;
cin>>king.lift>>king.right;
for(int i=1;i<=n;i++)
{
cin>>da[i].lift>>da[i].right;
sum[i]=1;
}
sort(da+1,da+n+1,compare);
sum[0]=king.lift;
for(int i=1;i<=n;i++)
{
big temp;
temp=da[i].lift;
sum[i]=sum[i-1]*temp;
}
for(int i=1;i<=n;i++)
{
ans[i]=sum[i-1]/da[i].right;
}
max1=ans[1];
for(int i=2;i<=n;i++)
{
max1=max(ans[i],max1);
}
cout<<max1;
return 0;
}
前面是个封装高精,应该不会挂吧(?)