B. Minimum Product(数学)

https://codeforces.com/contest/1409/problem/B


最开始思路:假设a>b,那么a*(b-1)和(a-1)*b相比,肯定是前者少得更多。所以尽可能把小的减了。然后看到最后一个样例并没有过。

正确思路:两个各自减最多,多余就减另一个。

证明: 设待减数为x,y且x>y。那么由于x,y给定,则x+y=a,x-y=b;

那么可以得到x=(a+b)/2,y=(a-b)/2,xy=(a^2-b^2)/4,由于a是x+y的固定和,所以b越小越好。也就是两者各自减最多。

或者也可以用函数去证。假设给a了t个,给b了就是n-t个。可以得到y=-t^2-t*(a+b-n)-a*b-a*n。开口向下的二次函数。

t的约束条件分析出来是     max(0,y+n-b)<=t<=min(a-x,n) 取端点函数值最大

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5;
typedef long long LL;
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  LL t;cin>>t;
  while(t--)
  {
  	LL a,b,x,y,n;cin>>a>>b>>x>>y>>n;
  	//a减到底
  	LL fa=a;LL fb=b;LL fn=n;
	
	LL p=fa-min(fn,fa-x);
	
	fn-=(fa-p);
	
	if(fn>0)  fb=fb-min(fn,fb-y);	
	LL res1=p*fb;
	
	LL ka=a;LL kb=b;LL kn=n;
	
	LL h=kb-min(kn,kb-y);
	kn-=(kb-h);
	if(kn>0) ka=ka-min(kn,ka-x);
	LL res2=h*ka;
	
	cout<<min(res1,res2)<<endl; 
  }
return 0;
}

猜你喜欢

转载自blog.csdn.net/zstuyyyyccccbbbb/article/details/108420979