Minimum Product
原题链接
//codeforc.es/problemset/problem/1409/B
#
思路
给定五个数:a,b,x,y,n;
首先我们接下来做任何操作都要保证a>=x&&b>=y
,我们有操作:将a,b其中一个数值减一,最多执行n次这个操作。
问a*b的最小值。
水题:判断尽量减a的值还是尽量减b的值,下面代码中q*e就是尽量减a的值,将两种情况的结果进行比较选出较小的。
给定例子:10 11 9 1 10
注意:一开始我的思路是尽量去在小的数上进行操作,如上我们将10每次减1都会将a*b的值减去11,而在11上进行操作却只会减去10。这样子好像是对的,但是这个样例若果我们从小数开始减最后总共能减去11 + 9 * 9 = 92
,而在11上进行操作却能总共减去10 * 10 = 100
,所以这个思路是错误的,其错误在我们有限次将小数减小后,但在后面我们对大数进行足够多次操作后,先减小数得到的优势能够因为这大数的操作而抵消甚至成为一种负担,可以好好思考一下这个样例!我们还是应该进行判断到底应该尽量减哪一个数!
#include<stdio.h>
int main()
{
int t;
scanf("%d", &t);
long long int a, b, x, y, n;
long long int aa, bb, ans;
for (; t > 0; t--)
{
scanf("%lld %lld %lld %lld %lld", &a, &b, &x, &y, &n);
aa = a - n;
if (aa < x)
{
aa = x;
}
bb = b - (n - (a - aa));
if (bb < y)
{
bb = y;
}
ans = aa * bb;
bb = b - n;
if (bb < y)
{
bb = y;
}
aa = a - (n - (b - bb));
if (aa < x)
{
aa = x;
}
if (ans > aa * bb)
{
ans = aa * bb;
}
printf("%lld\n", ans);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a, b, x, y, n, t;
ll q, w, e, r;
int main() {
cin>>t;
while (t--)
{
cin >> a >> b >> x >> y >> n;
q = max(x, a - n);
w = max(y, b - n);
e = max(y, b - n + a - q);
r = max(x, a - n + b - w);
cout << min(q * e, w * r) << endl;
}
return 0;
}
还没有评论,来说两句吧...