游戏钦点 构造
题号:NC21705
游戏钦点
构造题
1,计算出总比赛次数 k
2,特判 x == 2 || y == 2 情况,一旦出现,必不可能,不能只判断x,还要判断y 坑!
3,贪心求最小次数,从大往下枚举,能用就用,可递归(特判 2 这个数),也可从大到小,不能处理时 该位置必定大于 剩余的x
只需 判断一下x的奇偶即可。
/*
hello world!
Just do it!
start time:2022-04-28 10:43:15.393571
*/
// #pragma GCC optimize (2)
// #pragma G++ optimize (2)
#include
#define zero(x) memset(x, 0, sizeof(x));
#define one(x) memset(x, -1, sizeof(x));
#define m_INF(x) memset(x, 0x3f, sizeof(x));
#define m_inf(x) memset(x, 0x3f, sizeof(x));
#define m_f_INF(x) memset(x, -0x3f, sizeof(x));
#define m_f_inf(x) memset(x, -0x3f, sizeof(x));
#define all(x) x.begin(), x.end()
#define endl "\n"
#define fi first
#define se second
#define lbt(x) ((x)&(-x))
#define pb push_back
struct cmpl{ template bool operator()(const A &a1, const B &b1) { return b1 < a1; } };
struct cmpg{ template bool operator()(const A &a1, const B &b1) { return a1 < b1; } };
#define p_ql(x) priority_queue, cmpl>
#define p_qlp(x, y) priority_queue, vector>, cmpl>
#define p_qg(x) priority_queue, cmpg>
#define p_qgp(x, y) priority_queue, vector>, cmpg>
template bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }
#define fo(i,from,to) for(int i=(from),ooo=(from)<(to)?1:-1,oooo=(to)+ooo;i!=oooo;i+=ooo)
#define fol(i,from,to) for(long long i=(from),ooo=(from)<(to)?1:-1,oooo=(to)+ooo;i!=oooo;i+=ooo)
#define foo(i,ooo) for(auto i=ooo.rbegin();i!=ooo.rend();++i)
#define foa(i,from,to) for(int i=(from),ooo=(to);i<=ooo;++i)
#define fos(i,from,to) for(int i=(from),ooo=(to);i>=ooo;--i)
using namespace std;
#ifndef LOCAL
# define dbg(...) ;
#endif
#define itn int
#define int long long
#ifdef int
#define inf (0x3f3f3f3f3f3f3f3f)
#else
#define inf (0x3f3f3f3f)
#endif
typedef long long ll; typedef unsigned long long ull; typedef pair pii;
const int dir[8][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}}, INF = 0x3f3f3f3f, f_inf = -1044266559, f_INF = -1044266559;
const double eps = 1e-6;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 10;
const int N = 2e6 + 10;
int n, m;
void init()
{
}
int dg(int x, int p)
{
// dbg(x, p)
// if(x == 0) return 0;
// if(x == 2) return 2;
int num = 0;
while(x && 2 * p - 1 <= x) {
x -= 2 * p - 1;
p--;
num++;
}
// return num + dg(x, p - 1);
if(x == 0) return num;
if(x & 1) return num + 1;
return num + 2;
}
void solve()
{
int x, y;
cin >> x >> y;
int k = sqrt((x + y));
dbg(k)
if(k * k != (x + y) || x == 2 || y == 2) {
cout << "-1\n";
return;
}
int res = dg(x, k);
cout << res << endl;
}
signed main()
{
#ifdef LOCAL
freopen("read.in", "r", stdin);
freopen("write.out", "w", stdout);
#endif
std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);
init();
int t = 0, num2 = 0;
t = 1;
if (!t) cin >> t;
while (t--) {
//cout<<"Case "<<++num2<<": ";
solve();
}
return 0;
int num1 = 0;
//while (scanf("%d", &n) !=-1 && n)
while (cin >> n && n) {
//cout<<"Case "<<++num1<<": ";
solve();
}
return 0;
}