51Nod-1390-游戏得分
来源:互联网 发布:淘宝免费申请试用在哪 编辑:程序博客网 时间:2024/05/23 22:36
ACM模版
描述
题解
根据题意,不难发现这是一个等差数列,一定用到了等差数列的相关性质。
先考虑输出-1的情况,我们则需要考虑x+y
的规律,以及所有能出现的x
的规律。这个不难发现,x+y
一定是完全平方数,而x
可以为1到n^2
中除去2的任何一个数,那么我们就很容易搞定-1
的情况。
接着,通过贪心,我们知道,想要数目最少,必须尽量选择后边的数,那么我们可以判断后边的数至少有几个才能比x
大,那么就一定存在对应的情况来表示x
。
这里,提供两个代码,思路大差不差,第二个略微优化了,猛一下看不懂很正常,因为中间有公式的推导,其实很简单,就是等差数列的相关公式的推导而已。
代码
One:
#include <iostream>#include <cmath>using namespace std;const int INF = 0x3f3f3f3f;int ans;long long x, y;void dfs(long long round, long long tmp, int count){ if (tmp == 0 && count < ans) { ans = count; return ; } for (long long i = round; i > 0; i--) { if (ans != INF) { break; } if (2 * i - 1 > tmp) { continue; } if (i * i < tmp) { break; } dfs(i - 1, tmp - 2 * i + 1, count + 1); } return ;}int main(int argc, const char * argv[]){ int T; cin >> T; while (T--) { cin >> x >> y; int round = (int)sqrt(x + y); if (round != sqrt(x + y) || x == 2 || y == 2) { cout << "-1\n"; continue; } ans = INF; dfs(round, x, 0); cout << ans << '\n'; } return 0;}#include <iostream>#include <cmath>#define LL long longusing namespace std;int main(){ LL a, b, sum; LL T; cin >> T; while (T--) { cin >> a >> b; sum = a + b; double tmp = sqrt(sum * 1.0); LL count; if (tmp != floor(tmp) || a == 2 || b == 2) { cout << -1 << endl; continue; } else { count = tmp; // 回合总数 } if (!b) // 当b为0时可以直接输出回合总数 { cout << count << endl; continue; } LL t = 0; bool flag = false; LL num = 0; for (LL i = 1; i <= count; ++i) { if (i * i > a) { break; } t = a + i; num = (2 * count - i + 1) * i / 2; if (t % 2 == 0 && ((LL)(t / 2.0 + 0.5) <= num)) { cout << i << endl; flag = true; break; } } if (!flag) { cout << 0 << endl; } } return 0;}
Two:
#include <iostream>#include <cmath>using namespace std;int T;long long x, y;int main(){ cin >> T; while (T--) { cin >> x >> y; long long up = (long long)sqrt(x + y); bool flag = false; if ((x + y) == up * up) { if (x == 0) { cout << 0 << endl; continue; } long long i = 1; if ((x & 1) == 0) { i += 1; } for (; i <= up; i += 2) { if (i * i <= x && x <= 2 * i * up - i * i) { flag = true; cout << i << endl; break; } } } if (!flag) { cout << -1 << endl; } } return 0;}
0 0
- 51Nod-1390-游戏得分
- 51NOD-1390 游戏得分
- 51nod-1390 游戏得分
- 51nod 1390 游戏得分
- 51Nod-1390-游戏得分
- 51nod-1390-游戏得分
- 51nod 1390 游戏得分
- 51nod 1390 游戏得分(贪心)
- 51nod oj 1390 游戏得分 1351 吃点心【贪心】
- 51nod 1390 游戏得分【贪心+思维+谨慎】
- 51Nod-1066-Bash游戏
- 51Nod-1069-Nim游戏
- 51Nod-1072-威佐夫游戏
- 51Nod-1459-迷宫游戏
- 51Nod-1381-硬币游戏
- 51Nod-1319-跳跃游戏
- 51Nod-1337-翻转游戏
- 游戏得分
- 2016.09.10【初中部 NOIP普及组 】模拟赛题解
- 51nod 1714 B君的游戏
- SQL子查询的一些例子
- 1-XHTML导论
- 常用的几个UI美化
- 51Nod-1390-游戏得分
- jQuery使用ajaxSubmit()提交表单示例
- DOM解析XML和生成
- 时钟三:用内部中断实现时钟
- Tarjan求强连通分量算法
- Generating News Headlines with Recurrent Neural Networks
- UnityShader - 基础 - Normal Map 法线贴图
- 初中OJ1996【2015.8.3普及组模拟赛】WZK旅游(seek)
- [无源汇最大费用可行流 差分费用流] Codeforces 717G Bubble Cup 9 - Finals G. Underfail