51nod 1390 游戏得分
2017-11-18 13:38
183 查看
A与B两人玩一个游戏,这个游戏有若干个回合(可能0回合)。游戏的回合依次标号为1,2,3,4...。你不需要关心游戏的内容,现在只要知道第i回合胜者会获得2*i-1分,每回合游戏不存在平局。现在已知A和B在游戏结束时各获得了x分与y分的总分。问A在这个游戏中至少获胜了几盘?如果给出的x与y一定不会出现那么输出-1.
Input
Output
Input示例
Output示例
首先我们肯定是要通过x+y来判断总局数
如果x+y不能被开方,则无答案,否则总局数就是开放后的数n;
之后如果x为0,则输出0。
如果x为n,则输出n。
如果x=2或者y=2,则无答案。
以上都是需要特别判断的。
之后对于a来说,我们想要局数尽可能少,那么就是赢的局数的得分尽可能大。越往后越好。
那么我们从n到1开始贪心。
对于当前第i局,如果第i局的得分小于等于n,那么这一局要拿下,a减去这局得分,num++。继续遍历。
如果当前局大于a了,说明a已经很小了,当前局肯定是不能用的,会超出得分的。那么如果a现在是一个奇数,那么只需要从前面的局数中选择一个恰好等于a的得分的局即可,因为这是一个等差数列,肯定会存在对应的奇数。直接num+1,break即可。
如果当前a是一个偶数,那么我们只需要从前面取出两局,一定能加起来恰好等于a。这是差值等于2的等差数列的性质。直接num+2后break即可。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
using namespace std;
long long t;
long long a,b;
int main()
{
cin>>t;
while(t--)
{
cin>>a>>b;
long long falg=0;
long long num=0;
long long z1=a+b;
long long n=sqrt(z1);
if(n*n!=a+b)
{
falg=1;
}
if(falg||a==2||b==2)
{
cout<<"-1"<<endl;
continue;
}
if(a==0)
{
cout<<"0"<<endl;
continue;
}
if(b==0)
{
cout<<n<<endl;
continue;
}
for(long long i=n;i>=1;i--)
{
long long d=2*i-1;
if(a>d)
{
a-=d;
num++;
}
else
{
if(a%2==1)
{
num++;
}
else
{
num+=2;
}
break;
}
}
cout<<num<<endl;
}
}
Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5 每组测试数据有相同的结构构成: 每组数据一行包含两个整数x,y,表示A与B最后的总得分,其中0<=x,y<=1,000,000,000,000。
Output
每组数据一行输出,即A最少获胜了几盘,非法的x与y对输出-1。
Input示例
3 8 17 17 8 0 0
Output示例
2 30
首先我们肯定是要通过x+y来判断总局数
如果x+y不能被开方,则无答案,否则总局数就是开放后的数n;
之后如果x为0,则输出0。
如果x为n,则输出n。
如果x=2或者y=2,则无答案。
以上都是需要特别判断的。
之后对于a来说,我们想要局数尽可能少,那么就是赢的局数的得分尽可能大。越往后越好。
那么我们从n到1开始贪心。
对于当前第i局,如果第i局的得分小于等于n,那么这一局要拿下,a减去这局得分,num++。继续遍历。
如果当前局大于a了,说明a已经很小了,当前局肯定是不能用的,会超出得分的。那么如果a现在是一个奇数,那么只需要从前面的局数中选择一个恰好等于a的得分的局即可,因为这是一个等差数列,肯定会存在对应的奇数。直接num+1,break即可。
如果当前a是一个偶数,那么我们只需要从前面取出两局,一定能加起来恰好等于a。这是差值等于2的等差数列的性质。直接num+2后break即可。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
using namespace std;
long long t;
long long a,b;
int main()
{
cin>>t;
while(t--)
{
cin>>a>>b;
long long falg=0;
long long num=0;
long long z1=a+b;
long long n=sqrt(z1);
if(n*n!=a+b)
{
falg=1;
}
if(falg||a==2||b==2)
{
cout<<"-1"<<endl;
continue;
}
if(a==0)
{
cout<<"0"<<endl;
continue;
}
if(b==0)
{
cout<<n<<endl;
continue;
}
for(long long i=n;i>=1;i--)
{
long long d=2*i-1;
if(a>d)
{
a-=d;
num++;
}
else
{
if(a%2==1)
{
num++;
}
else
{
num+=2;
}
break;
}
}
cout<<num<<endl;
}
}
相关文章推荐
- 51Nod-1390-游戏得分
- 51nod 1390 游戏得分(贪心)
- 51nod 1390 游戏得分
- 51nod-1390 游戏得分
- 51Nod-1390-游戏得分
- 51NOD-1390 游戏得分
- 51nod 1390 游戏得分【贪心+思维+谨慎】
- 51nod oj 1390 游戏得分 1351 吃点心【贪心】
- 游戏得分
- 51Nod-1319-跳跃游戏
- 51Nod 1536 不一样的猜数游戏
- 51nod 1490 多重游戏
- 51nod 1459 迷宫游戏
- 51nod 1070 Bash游戏 V4(博弈——找规律)
- [51Nod 1185 威佐夫游戏 V2]Wythoff Game+乘法模拟
- 放球游戏(51nod 1418)模拟
- 51Nod - 1459 迷宫游戏 dijkstra拓展
- leetcode 682. Baseball Game 棒球游戏得分计算
- 51NOD 1070 Bash游戏 V4(斐波那契博弈)
- 51nod 1066 bash游戏