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] ...
随机推荐
- python常用功能
1. 获取昨天日期 引入datetime模块 import datetime def getYesterday(): today = datetime.date.today() #返回当前本地日期 # ...
- SharkCTF2021 bybypass&baby_phpserialize题记
(国庆褪10天了 先水一篇) bybypass: payload:?anime_is_bae=hehellotherehoomanllotherehooman baby_phpserialize ro ...
- AIApe问答机器人Scrum Meeting 4.27
Scrum Meeting 3 日期:2021年4月27日 会议主要内容概述:汇报两日工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明昕 后端 Tas ...
- [no code][scrum meeting] Beta 3
$( "#cnblogs_post_body" ).catalog() 例会时间:5月15日11:30,主持者:肖思炀 下次例会时间:5月16日11:30,主持者:伦泽标 一.工作 ...
- 2021.8.18 NKOJ周赛总结
两个字总结:安详 T1: NKOJ-6179 NP问题 问题描述: p6pou在平面上画了n个点,并提出了一个问题,称为N-Points问题,简称NP问题. p6pou首先在建立的平面直角坐标系,并标 ...
- UVA-1498 Activation
UVA-1498 DP应该是肯定的,设 f [ i ] [ j ] 表示现在对中共有 i 人,Tomato在第 j 个,出现所求情况的概率,我们可以很(简单的)艰难的列出下列方程: f[i][1] = ...
- 难搞的C语言指针你搞懂了多少
C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以 十九个例子来给大家简单的分析一下指针的应用,最后会有C语言视频资料提供给大家更加深入的参考 ...
- 绑定socket描述符到一个网络设备
网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题: 在多 IP/网卡主机上,UDP ...
- hdu 1856 More is better(并查集)
题意: Mr Wang wants some boys to help him with a project. Because the project is rather complex, the m ...
- 挂载iscsi存储
参考连接:https://segmentfault.com/a/1190000005853387?utm_source=tag-newest 安装客户端工具,iscsi-initiator yum i ...