题目描述
游游拿到了一个正整数a,她每次操作可以选择将a加上x,但必须满足l≤x≤r。游游希望操作结束后a恰好等于b。游游想知道,最少需要多少次操作,最多需要多少次操作?
输入描述:
共有t组询问。 每组询问输入四个正整数a,b,l,r。 1≤t≤104
1≤l≤r≤109
1≤a≤b≤109
输出描述:
对于每组询问,输出一行答案。 如果无论如何都不能让a等于b,则输出-1。 否则输出两个整数,分别代表最少操作次数和最多操作次数。
示例1
输入
3 1 6 2 5 1 4 2 2 2 10 2 6
输出
1 2 -1 2 4
说明
第一组询问,操作一次的方案:直接使a加5。操作2次的方案:先加2再加3。 第二组询问,由于只能加2,显然无法使得1变成4。 第三组询问,操作2次的方案:先加3再加5(方案不唯一)。操作4次的方案:加4次2。
一道思维题,代码中有解释。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int mod=1e9+7;
const int M=4e4+10;
const int N=1e5+10;
const int INF=0x3f3f3f3f;
int minn=0x3f3f3f3f;
int maxn=0xc0c0c0c0;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
ll n,m,s,e,k,h,mx,a,b,l,r;
void solve()
{
cin>>a>>b>>l>>r;
int cha1=b-a;//我们只需要考虑差值
int cha2=r-l;//接下来的判断需要
int maxx=cha1/l;//最大操作次数
int re=cha1-maxx*l;//最大操作后还剩余的数
if(maxx*cha2>=re)//我们可以知道,加上的数x,其最大差值即为cha2,所以如果此判断不满足,那么不可能会有合理解
cout<<(cha1+r-1)/r<<" "<<maxx<<endl;//这个判断最少操作次数很好,可以理解后记一下
else
cout<<-1<<endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
ll t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}