题目描述:传送门
思路:
本题一看就是贪心。
我们设参考值s = 左手的数 * 右手的数;
最后只要对s进行排序即可。
最后,别忘了写高精。
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int left, right;
long long num;
}per[1005];
template < typename T > void read(T &x)
{
int f = 1;x = 0;char c = getchar();
for (;!isdigit(c);c = getchar()) if (c == '-') f = -f;
for (; isdigit(c);c = getchar()) x = x * 10 + c - '0';
x *= f;
}
int ax[10005], bx[10005], cx[10005];
string time(string sa, string sb)
{
int lena = sa.size();
int lenb = sb.size();
reverse(sa.begin(), sa.end());
reverse(sb.begin(), sb.end());
for(int i = 0;i < lena;i++)
ax[i] = sa[i] - '0';
for(int i = 0;i < lenb;i++)
bx[i] = sb[i] - '0';
long long jw = 0, i, j;
for(i = 0;i < lena;i++)
{
jw = 0;
for(j = 0;j < lenb;j++)
{
cx[i + j] += ax[i] * bx[j] + jw;
jw = cx[i + j] / 10;
cx[i + j] %= 10;
}
if(jw > 0) cx[i + j] += jw;
}
int len = lena + lenb;
while(cx[len] == 0 && len > 0) len--;
string anss = "";
for(int i = len;i >= 0;i--)
anss += char(cx[i] + '0');
memset(ax, 0, sizeof(ax));
memset(bx, 0, sizeof(bx));
memset(cx, 0, sizeof(cx));
return anss;
}
string change(int n)
{
string anss = "";
if(n == 0) return "0";
while(n)
{
anss += char(n % 10 + '0');
n /= 10;
}
reverse(anss.begin(), anss.end());
return anss;
}
string compare(string sa, string sb)
{
if(sa[0] == '0') sa = '0';
if(sb[0] == '0') sb = '0';
int lena = sa.size();
int lenb = sb.size();
if(lena > lenb) return sa;
if(lena < lenb) return sb;
for(int i = 0;i < lena;i++)
{
if(sa[i] > sb[i]) return sa;
if(sa[i] < sb[i]) return sb;
}
return sa;
}
string div(string sa, int sb)
{
string r = "", anss = "";
long long d = 0;
if(sa == "0") return sa;
for(int i = 0;i < sa.size();i++)
{
r += (d * 10 + sa[i] - '0') / sb + '0';
d = (d * 10 + (sa[i] - '0')) % sb;
}
int p = 0;
for(int i = 0;i < r.size();i++)
if(r[i] != '0')
{
p = i;
break;
}
return r.substr(p);
}
bool cmp(node x,node y)
{
return x.num < y.num;
}
int main()
{
int n;
cin >> n;
cin >> per[1].left >> per[1].right;
if (n == 0)
{
cout << 0 << endl;
return 0;
}
for (int i = 2;i <= n + 1;i++)
{
read(per[i].left);
read(per[i].right);
per[i].num = per[i].left * per[i].right;
}
if (n == 1)
{
cout << per[1].left / per[2].right << endl;
return 0;
}
sort(per + 2, per + n + 2, cmp);
string s = "1";
string maxn = "0";
for (int i = 2;i <= n + 1;i++)
{
s = time(s, change(per[i - 1].left));
string xd = "";
string t = s;
xd = div(t, per[i].right);
maxn = compare(maxn, xd);
}
cout << maxn << endl;
return 0;
}