1. 程式人生 > >Newcoder 110 F.Alice收集玩偶(計算幾何)

Newcoder 110 F.Alice收集玩偶(計算幾何)

Description

A l i c e Alice 是個小女孩,最近經常睡得很晚起得也很晚。 她的母親希望她能戒掉這個壞習慣,所以對 A

l i c e Alice 說:“如果你早睡一天,我會給你一張粉紅色的貼紙。 如果你早起一天,我會給你一張橙色的貼紙。"

A l

i c e Alice 長大後,她成為了一個早睡早起的好女孩。 她已經收集了 A A 張粉紅色的貼紙和 B
B
張橙色的貼紙。 但她不再喜歡貼紙。 所以她再也不會收集貼紙了。 有一天,她向媽媽抱怨她不喜歡貼紙了。 她的母親對她說:“那麼現在,你可以用 x 1 x_1 張粉紅色貼紙和 y 1 y_1 張橙色貼紙來換一隻小貓玩偶,或者用 x 2 x_2 張粉紅色貼紙和 y 2 y_2 張橙色貼紙來換一隻小狗玩偶。

A l i c e Alice 聽了媽媽的話開心了起來,她想收集儘可能多的玩偶。

現在,請您計算 A l i c e Alice 可以獲得的玩偶數量最多是多少(玩偶都是完整的,沒有半隻玩偶這類的東西)。

Input

輸入的第一行將包含一個整數 T T ,表示您應該處理的查詢數量。

對於每個查詢,給出一行包含六個整數 A B x 1 y 1 x 2 y 2 A,B,x_1,y_1,x_2,y_2 ,表示上述語句中的數值。

( 1 T 1 0 5 , 1 A , B , x 1 , y 1 , x 2 , y 2 2 1 0 9 ) (1\le T\le 10^5,1\le A,B,x_1,y_1,x_2,y_2\le 2\cdot 10^9)

Output

對於每個查詢,輸出一行表示答案的整數。

Sample Input

4
10 10 2 3 3 2
10 14 2 3 3 2
10 15 2 3 3 2
1000000000 999999999 1 4 10000 3

Sample Output

4
4
5
250018751

Solution

不妨設 x 1 x 2 x_1\le x_2 ,若 x 1 = x 2 x_1=x_2 則不妨設 y 1 y 2 y_1\le y_2

y 1 y 2 y_1\le y_2 顯然全買第一種即可,否則假設買 t t 個第一種,那麼最多可以買的個數為
t + m i n ( A x 1 t x 2 , B y 1 t y 2 ) t+min(\frac{A-x_1\cdot t}{x_2},\frac{B-y_1\cdot t}{y_2})
也即為 y = x 2 x 1 x 2 t + A x 2 y=\frac{x_2-x_1}{x_2}\cdot t+\frac{A}{x_2} y = y 2 y 1 y 2 t + B y 2 y=\frac{y_2-y_1}{y_2}\cdot t+\frac{B}{y_2} 兩條直線取較小值後的最大值,顯然第一條直線單增,第二條直線單減,兩者取最小值應為一個先增後減的折線,求出兩條直線交點對應的 t t 值,判斷其是否合法,如果合法則該 t t 值即為所求,否則取兩個端點值比較一下選出較優值即為答案,注意到這裡的 t t 值需要是整數,而兩條直線交點對應的橫座標不一定是整數,故也需取交點橫座標左右兩個 t t 值進行比較

Code

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
#define y1 yy1
int T,A,B,x1,x2,y1,y2;
int get(int t)
{
	if(A/x1<t||B/y1<t)return 0;
	return t+min((A-x1*t)/x2,(B-y1*t)/y2);
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d%d%d%d",&A,&B,&x1,&y1,&x2,&y2);
		int ans=0;
		if(x1>x2)swap(x1,x2),swap(y1,y2);
		if(x1==x2&&y1>y2)swap(y1,y2);
		if(y1<=y2)printf("%d\n",get(min(A/x1,B/y1)));
		else
		{
			ll temp=(1ll*x2*B-1ll*y2*A)/(1ll*x2*y1-1ll*x1*y2);
			if(temp<0||temp>min(A/x1,B/y1))printf("%d\n",max(get(0),get(min(A/x1,B/y1))));
			else printf("%d\n",max(get(temp),get(temp+1)));	
		}
	} 
	return 0;
}