思路:
我们首先考虑,怎样进行贪心排序
我们设一个si表示前i个a的相乘
我们首先考虑排序交换前,第i个上的值是
s
i
−
1
/
b
i
s_{i-1}/b_i
si−1/bi,第i+1个是
s
i
−
1
∗
a
i
/
b
i
+
1
s_{i-1}*a_i/b_{i+1}
si−1∗ai/bi+1
交换后各为
s
i
−
1
/
b
i
+
1
s_{i-1}/b_{i+1}
si−1/bi+1,
s
i
−
1
∗
a
i
+
1
/
b
i
s_{i-1}*a_{i+1}/b_{i}
si−1∗ai+1/bi
那么我们发现
s
i
−
1
/
b
i
s_{i-1}/b_i
si−1/bi<
s
i
−
1
∗
a
i
+
1
/
b
i
s_{i-1}*a_{i+1}/b_{i}
si−1∗ai+1/bi
那么我们只用比较
s
i
−
1
∗
a
i
+
1
/
b
i
s_{i-1}*a_{i+1}/b_{i}
si−1∗ai+1/bi和
s
i
−
1
∗
a
i
/
b
i
+
1
s_{i-1}*a_i/b_{i+1}
si−1∗ai/bi+1就可以了
通过化简,得:
a
i
∗
b
i
<
a
i
+
1
∗
b
i
+
1
a_i*b_i<a_{i+1}*b_{i+1}
ai∗bi<ai+1∗bi+1
由此可见,对a*b进行关键字排序就可以了
c o d e code code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n, a1, b;
long long sum[50001], k[50001], ans[50001];
struct node
{
long long x, y;
}a[100010];
bool cmp(node x, node y)
{
return x.x*x.y<y.x*y.y;
}
void times(long long b)
{
long long g=0;
for(long long i=1; i<=50000; i++)
{
sum[i]=sum[i]*b+g;
g=sum[i]/10;
sum[i]%=10;
}
}
void fz()
{
for(long long i=1; i<=50000; i++)
k[i]=ans[i];
}
void fc(long long b)
{
long long i=50000;
memset(ans, 0, sizeof(ans));
while(sum[i]==0)
i--;
long long ys=0;
for(; i>=1; i--)
{
ys=ys*10+sum[i];
ans[i]=ys/b;
ys=ys%b;
}
long long kw=50000;
while(k[kw]==0)kw--;
long long answ=50000;
while(ans[answ]==0)answ--;
if(kw>answ)
return;
else if(answ>kw)
fz();
else
{
for(long long i=kw; i>=1; i--)
if(ans[i]>k[i])
fz();
else if(ans[i]<k[i])
return;
}
}
int main()
{
scanf("%lld", &n);
scanf("%lld%lld", &a1, &b);
for(long long i=1; i<=n; i++)
scanf("%lld%lld", &a[i].x, &a[i].y);
sort(a+1, a+1+n, cmp);
long long j=0;
while(a1!=0)
{
sum[++j]=a1%10;
a1=a1/10;
}
for(long long i=1; i<=n; i++)
{
fc(a[i].y);
times(a[i].x);
}
long long i=50000;
while(k[i]==0)i--;
for(; i>=1; i--)
printf("%lld", k[i]);
return 0;
}