HDU 7066 - NJU emulator(构造题)
提供一种不同于官方题解、需要的操作次数比官方题解多(官方题解大概是 \(2\times 16\),我这大概是 \(3\times 16\)),但能通过此题的做法。
首先我们考虑一个暴力,我们设一个阈值 \(B=2^k\),然后我们考虑预处理出 \(1\sim B\) 中所有数,即,先一遍 p1,然后每次 dup 一遍,然后调用 add 指令给栈顶上的数加 \(1\)(显然此时 \(1\) 在栈中),如此操作 \(B-1\) 次即可让 \(1\sim B\) 中所有数都在栈中。然后再新开一个元素表示答案,然后我们就每 \(k\) 个元素一块,从高位开始,每次乘以 \(2^k\)(由于 \(2^k\) 此时已经在栈中,直接调用 mul 指令即可),然后取出这 \(k\) 位表示的数,调用 add 指令累加到答案中即可,不难发现这样操作次数为 \(2(B+\dfrac{64}{k})\) 级别的,取 \(k=4\) 即 \(B=16\) 时最优。
但这样需要 \(4\times 16\) 次操作,无法卡过本题 \(50\) 次的限制,考虑优化,注意到本题还有一个 sub 命令我们没有调用,因此我们考虑这样一件事情,我们第一部分只预处理出 \(1\sim 8\) 附加上 \(16\),这样我们第二部分时,假设我们目前处理的这 \(k\) 位值为 \(v\),那么如果 \(v\le 7\),显然 \(v\) 此时已经在栈中,我们就直接用 add 命令将 \(v\) 加到栈顶元素上去即可,但如果 \(v\ge 8\) 就不太好直接处理了。一个很直观的想法是,我们直接加 \(16\),然后减掉该减的部分,但这样还是会卡成 \(4\times 16\),样例 \(N=2^{64}-1=18446744073709551615\) 都过不了,不过注意到在上一步中我们已经乘了个 \(16\),因此我们考虑在上一轮操作中“预测未来”,即,如果下一轮表示的数 \(\ge 8\) 那么我们就让这轮中最后四位表示的数变成 \(v+1\),否则直接调到 \(v\) 即可,这样就省去了那个 \(+16\) 的操作了。这样操作次数就是 \(3\times 16\) 级别的了。
还有一些地方需要卡卡,否则可能会出现 \(51\) 次操作的悲催情况。
u1s1 这题操作次数卡得是真的紧,下面这份代码中操作次数的上限就是 \(50\),在 \(n=2^{63}-1\) 处取到:
void solve(){
u64 x;scanf("%llu",&x);
printf("p1\n");
for(int i=2;i<=8;i++){
printf("dup\n");
printf("add %d\n",i-1);
} printf("dup\nadd 1\n");
int need=(x>>60&15)+((x>>56&15)>=8);
if(!need) printf("p1\nsub 9\n");
else if(need==1) printf("p1\n");
else if(1<need&&need<=9){
printf("p1\nadd %d\n",11-need);
} else if(need>9){
printf("dup\n");
if(need!=16) printf("sub %d\n",10-(16-need));
} printf("mul 1\n");
for(int i=14;~i;i--){
int v1=(x>>(i<<2)&15),v2=(!i)?0:(x>>(i-1<<2)&15);
if(v1<8&&v2<8){
if(v1) printf("add %d\n",10-v1);
} else if(v1<8&&v2>=8){
printf("add %d\n",9-v1);
} else if(v1>=8&&v2<8){
printf("sub %d\n",10-(16-v1));
} else {
if(v1^15) printf("sub %d\n",11-(16-v1));
} if(i) printf("mul 1\n");
} printf("end\n");
}
int main(){
int qu;scanf("%d",&qu);
while(qu--) solve();
return 0;
}
/*
7
15
16
16843009
1061109567
1152921504606846975
1152921504606846976
2305843009213693951
*/
HDU 7066 - NJU emulator(构造题)的更多相关文章
- HDU 5355 Cake (WA后AC代码,具体解析,构造题)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5355 题面: Cake Time Limit: 2000/1000 MS (Java/Others) ...
- hdu4671 Backup Plan ——构造题
link:http://acm.hdu.edu.cn/showproblem.php?pid=4671 其实是不难的那种构造题,先排第一列,第二列从后往前选. #include <iostrea ...
- HDU 5573 Binary Tree 构造
Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...
- cf251.2.C (构造题的技巧)
C. Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabyt ...
- Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...
- HDU 5710 Digit-Sum (构造)
题意: 定义S(N) 为数字N每个位上数字的和.在给两个数a,b,求最小的正整数n,使得 a×S(n)=b×S(2n). 官方题解: 这道题目的结果可能非常大,所以我们直接枚举n是要GG的. 首先可以 ...
- Codeforces 482 - Diverse Permutation 构造题
这是一道蛮基础的构造题. - k +(k - 1) -(k - 2) 1 + k , 1 , k , 2, ....... ...
- BZOJ 3097: Hash Killer I【构造题,思维题】
3097: Hash Killer I Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 963 Solved: 36 ...
- HDU.5385.The path(构造)
题目链接 最短路构造题三连:这道题,HDU4903,SRM590 Fox And City. \(Description\) 给定一张\(n\)个点\(m\)条边的有向图,每条边的边权在\([1,n] ...
随机推荐
- 【UE4 C++ 基础知识】<1> UPROPERTY宏、属性说明符、元数据说明符
属性声明 属性使用标准的C++变量语法声明,前面用UPROPERTY宏来定义属性元数据和变量说明符. UPROPERTY([specifier, specifier, ...], [meta(key= ...
- 【UE4 C++】Actor 与 Component —— 创建、销毁
Actor的生成与销毁 创建Actor实例 UClass* TSubclassOf<T> SpawnActor() UPROPERTY(EditAnywhere, Category = & ...
- Java:多线程计数
Java:多线程计数 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. CountDownLatch 概念 让一些线程阻塞直到另一些线程完成一系列操作才被唤醒 ...
- UltraSoft - Beta - Postmortem事后分析
UltraSoft - Beta - PostMORTEM 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题和定义都在[软软软]功能规格说明书 ...
- vs2010中使用命令行参数
使用VS2010增加命令参数的时候老是不起作用,后面经过研究发现,所要增加的命令参数是一个相对文件路径,而默认的工作目录里面没有该文件,所以就没有找到,需要修改工作目录,这样命令行参数才能够起作用.
- 计算机网络之介质访问控制(静态划分信道、FDM、TDM、STDM、WDM、CDM)、(动态划分信道、ALOHA、CSMA、CSMA/CD、CSMA/CA)、令牌传递协议
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104935912 学习课程:<2019王道考研计算机网络> 学习目的 ...
- linux中的分号 && ||
几个符号的用法 ; 顺序地独立执行各条命令, 彼此之间不关心是否失败, 所有命令都会执行. && 顺序执行各条命令, 只有当前一个执行成功时候, 才执行后面的. & 放在启动参 ...
- poj 2311 Cutting Game (SG)
题意: 有一张W*H的纸片. 每人每次可以横着撕或者竖着撕,先撕出1*1那一方胜. 数据范围: W and H (2 <= W, H <= 200) 思路: 很好抽象出游戏图的模型,用SG ...
- 【微服务理论】API + BFF
对于微服务,常见的架构模型就是API网关+服务. API网关实现鉴权.负载均衡.中间件等公共入口逻辑. 服务实现具体的业务功能. 那么,API网关设计中又有什么坑呢? 1.0版本 直接将服务穿透到外网 ...
- OOP作业总结一
PS:建议用 Edge 查看此博客,Chrome 的话文章界面会有点窄,看起来可能会比较难受,我想改宽点但是不会改. 我会改了!改宽了一些,现在看起来舒服了很多,芜湖. 问题数据已修复,我们胜利辣! ...