不多说
给虐就完事了
寄!
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define MAXX 1010
int a[MAXX];
int b[MAXX];
void save( int *a, int n)
{
for ( int i = 1; i <= n; ++i)
{
scanf_s("%d", &a[i]);
}
}
long long mul( int i)
{
return (1ll * a[i] * b[i] );
}
int main()
{
// 先存点数据
int n;
int k = 1;
long long best = 0;
scanf_s("%d", &n);
save(a, n);
save(b, n);
// 检验
//printf("%ll %ll", a[2], b[2]);
// 开始第一次筛选 选出最大的那个 赋予值为best 注意i从2开始 因为K的初始值为1 占据了i = 1的情况
for( int i = 2; i <= n; ++i)
{
if (mul(i) > mul(k))
{
k = i;
}
best = mul(k);
//考虑没有找到的情况【即全是最大值 都卖光了】 为后面判断if做准备
k = 0;
}
// 检验
//printf("%ll", best);
// 开始第二次筛选
for (int i = 1; i <= n; ++i)
{
// 第一个IF用BEST做指标筛掉其他BEST
if (mul(i) == best)
continue;
// 第二个IF用mul(k)做指标找到老二 赋值K 继续顶掉其他小弟
// 其实这里放一个second之类的会更有可读性 但是没有那么简洁
// 因为这里的操作都是k = i; 所以放在一起判断了
// 这同时也利用了截断
// 题解里是一步到位 用第二个IF同时进行了多到菜相同时的筛选
// 第一 用abs函数判断|ai - bi|
// 第二 用++i的有序性巧妙的省去了哪个组合序号最小的判断 K即为最小的序号
// 但是判断K == -1是为了甚么
if (k == -1 || mul(i) > mul(k) || mul(i) == mul(k) && abs(a[i] - b[i]) < abs(a[k] - b[k]))
k = i;
}
if (k)
{
printf("%d %lld\n", k, 1ll*a[k]*b[k]);
}
else
printf("sold out\n");
return 0;
}