51nod 1390 游戏得分
来源:互联网 发布:诺基亚n8下载软件 编辑:程序博客网 时间:2024/06/05 18:37
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5每组测试数据有相同的结构构成:每组数据一行包含两个整数x,y,表示A与B最后的总得分,其中0<=x,y<=1,000,000,000,000。
每组数据一行输出,即A最少获胜了几盘,非法的x与y对输出-1。
38 1717 80 0
230
首先我们肯定是要通过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 1390 游戏得分(贪心)
- 51nod oj 1390 游戏得分 1351 吃点心【贪心】
- 51nod 1390 游戏得分【贪心+思维+谨慎】
- 游戏得分
- 51nod 硬币游戏
- 51 nod bash游戏
- 迷宫游戏 51Nod
- 51Nod 迷宫游戏
- 威佐夫游戏 51Nod
- 51NOD 1459 迷宫游戏
- 51Nod 1459 迷宫游戏
- FastJson 快捷教程
- 色彩表示与编码
- 编程
- 栈应用之逆波兰表达式与表达式求值
- Caffe源码:math_functions 分析
- 51nod 1390 游戏得分
- cann't create instance in all devModuleCode.Please check register info in table pub_eventlistener
- PHP编译环境配置之EditPlus
- LSTM网络介绍
- CodeForces
- 使用ijkplayer播放一个网络视频
- QT中QWidget、QDialog及QMainWindow的区别
- Spring整合redis方法总结
- JVM原理讲解和调优