ural 鹰蛋&51nod 1306
来源:互联网 发布:mac限时免费大全 编辑:程序博客网 时间:2024/06/04 18:51
传送门:
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1306¬iceId=139696
思路:这道经典题我很久之前就想把它做掉了,但因为太懒一直没做,它的思路很传统也不难想到,但却十分经典给人以启发,
我的傻逼想法和论文中的想法是一样的。。。下面我叙述一下
算法一:
考虑直接
转移的话就是枚举一个
复杂度:
算法二:我们将
1.优化状态(定义域)
2.优化转移(决策)
3.值域范围
4.函数单调性
考虑几个极端情况,例如当
当
至于转移,我们观察,画出其函数图像,是两个单调函数取
那么进一步的,我们从差分和单调性的角度可以知道
那么我们将复杂度改进到了
算法三:
算法二已经没有任何优化的余地了。。。我们把它扔进垃圾桶
观察值域,注意到值域不会太大,当
自底向下,从
很明显,楼的层数,蛋的个数,步数两两之间都是单调的,值域又很小,我们可以
设
那么
复杂度:
多么像杨辉三角啊。。。实际上根据这个我们可以推出
代码:
#include<iostream>#include<cstring>#include<string>#include<cstdio>#define M 66#define N 70002#define N0 2000002 using namespace std;typedef long long LL;LL n,m,f[N][M],g[N0];const LL inf2 = 1000000000000000000LL;const LL inf = 1600000000LL;void init(){ memset(f,0,sizeof(f)); for (int i = 1;i < N - 1; ++i) f[i][1] = i; for (int i = 2;i < M - 1; ++i) for (int j = 1;j < N - 1; ++j){ f[j][i] = f[j - 1][i] + f[j - 1][i - 1] + 1; if (f[j][i] > inf2) f[j][i] = inf2 + 1; } for (LL i = 1;i < N0 - 1; ++i){ g[i] = g[i - 1] + 1 + (i * (i - 1) >> 1); if (g[i] > inf2) g[i] = inf2 + 1; }}LL case_two(LL n){ n <<= 1; LL mid,l = 0,r = min(n,(LL)inf); while (r - l > 1){ mid = (r + l)>>1; if (mid * (mid + 1) < n) l = mid; else r = mid; } if (l * (l + 1) >= n&&l * (l - 1) < n) return l; return r;}LL case_three(LL n){ LL l = 0,r = N0 - 2,mid; while (r - l > 1){ mid = (r + l)>>1; if (g[mid] < n) l = mid; else r = mid; } if (g[l] >= n&&g[l - 1] < n) return l; return r;}LL case_normal(LL n,LL m){ LL l = 0,r = N - 2,mid; while (r - l > 1){ mid = (r + l)>>1; if (f[mid][m] < n) l = mid; else r = mid; } if (f[l][m] >= n&&f[l - 1][m] < n) return l; return r;}void DO_IT(){ int T; scanf("%d",&T); while (T--){ scanf("%lld%lld",&n,&m); if (m == 1) printf("%lld\n",n); if (m == 2) printf("%lld\n",case_two(n)); if (m == 3) printf("%lld\n",case_three(n)); if (m > 3) printf("%lld\n",case_normal(n,m)); }}int main(){ init(); DO_IT(); return 0;}
总结:
- ural 鹰蛋&51nod 1306
- 51nod 1062 && URAL 1079 Maximum RMQ
- 51nod 1034 骨牌覆盖 V3 | URAL 1594 Aztec Treasure
- 最复杂的数(51Nod 1060 && ural 1748原题)
- [类欧几里得算法 数学技巧] 51Nod 1132 覆盖数字的数量 V2 & Ural 1797 Summit Online Judge. Version 2
- Ural 1306 Sequence Median
- ural 1306 Sequence Median
- 51Nod
- 51Nod
- 51nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- 51Nod
- JPA 菜鸟教程 7 双向多对多
- 使用Page Visibility监听网页是否处于激活(可见)状态
- 5.1之前, 全局变量存储在_G这个table中, 这样的操作:5.3 lua_setupvalue
- 当前数据库版本的发行时间表 (文档 ID 1626244.1)
- 1508-张晨曦总结《2016年-12月-3日》【连续43天总结】
- ural 鹰蛋&51nod 1306
- 51nod 1158 全是1的最大子矩阵
- App与其他应用交互之隐式意图的使用
- Django URL配置
- SpringMVC理解之一:应用上下文webApplicationContext
- apache 集成tomcat乱码问题解决
- code first demo中遇到的一点问题
- Implementing setfenv in Lua 5.2, 5.3, and above
- 巩固c语言