每日一题—— 送糖果

162 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

题目信息描述

Vladik 有 a 个糖果,Valera 有 b 个糖果。

两个人回合制的互送礼物给对方。

第一轮,Vladik 送给 Valera 1 个糖果。

第二轮,Valera 送给 Vladik 2 个糖果。

第三轮,Vladik 送给 Valera 3 个糖果。

以此类推,两人轮流给对方送糖果,且每轮送出的糖果数量都比上一轮多一个。

当某一轮,轮到某人送糖果时,如果糖果数量不够了,则停止互送礼物。

请问,是谁的糖果率先不够?

注意,每个人都只能送给对方自己事先准备的糖果。

自己收到的糖果不得再送还给对方。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含两个整数 a,b。

输出格式

每组数据输出一行结果,如果 Vladik 的糖果率先不够,则输出 Vladik,否则输出 Valera

数据范围

1≤T≤10, 1≤a,b≤109

输入样例:

2
1 1
7 6

输出样例:

Valera
Vladik

思路

  • 通过观察 我们可以发现 第一个人(以下简称a)每次送出的数量是1,3,5,...,2n-1
  • 而第二个人送出的数量是 2,4,6,...,2n
  • 显然是等差数列 由此根据等差数列求和公式
  • 若进行n轮(一轮ab各送一次)a要送nn颗糖 b要送n(n+1)颗
  • 所以 看谁能挺过最多轮数就能知道答案
  • a能挺过的轮数是他能手中糖的数量开平方下取整也就是ans1=(int)sqrt(n)
  • 而a能不能胜过b 只要看b手中的数量是不是小于b送ans1轮所需送的数量
  • 也就是判断ans1*(ans1+1)>b 大于则a胜利 否则b胜利
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
​
int c;
int a,b;
int main()
{
    scanf ("%d",&c);
    while (c--){
        scanf ("%d%d",&a,&b);
        string na[2]={"Vladik","Valera "};
        int ans1=sqrt(a);
        //cout<<ans1<<'\n';
        if (ans1*(ans1+1)>b) cout<<na[1]<<'\n';
        else cout<<na[0]<<'\n';
    }
    return 0;
}