描述
给定4个整数:a,b,x,y。刚开始a>=x,b>=y。你可以做如下操作不超过n次:
每次你可以选择a或者b,然后让它的值减少1;不过你要保证本次操作之后a的值不能小于x且b的值不能小于y。
问最多n次操作之后,a*b的最小值是多少?
输入 (读取文件: d.in)
多组测试数据。
第一行,一个整数T,表示有T组测试数据。1<=T<=20000。
接下来有T行,每行5个整数:a,b,x,y,n。1<=a,b,x,y,n<=10^9。
输出 (写入文件: d.out)
共T行,每行一个整数。
输入样例:
7
10 10 8 5 3
12 8 8 7 2
12343 43 4543 39 123212
1000000000 1000000000 1 1 1
1000000000 1000000000 1 1 1000000000
10 11 2 1 5
10 11 9 1 10
输出样例:
70
77
177177
999999999000000000
999999999
55
10
我的代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
int T;
long long min1[2010];
scanf("%d",&T);
for(int in=0;in<T;in++){
long long a,b,x,y,n,m1,m2,a2,b2,n2;
scanf("%d%d%d%d%d",&a,&b,&x,&y,&n);
n2=n;
if(a-x<n){
n=n-(a-x);
a2=x;
if(b-y<n){
b2=y;
}else{
b2=b-n;
}
}
else{
a2=a-n;
b2=b;
}
m1=a2*b2;
n=n2;
a2=0;b2=0;
if(b-y<n){
n=n-(b-y);
b2=y;
if(a-x<n){
a2=x;
}else{
a2=a-n;
}
}
else{
b2=b-n;
a2=a;
}
m2=a2*b2;
if(m1<m2)
min1[in]=m1;
else
min1[in]=m2;
//printf("%ld",min(m1,m2));
}
for(int in=0;in<T;in++)printf("%ld\n",min1[in]);
return 0;
}
但只通过了80%的数据。。