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] ...
随机推荐
- Redis:学习笔记-02
Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...
- UltraSoft - Beta - Scrum Meeting 8
Date: May 24th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 暂无 Kkkk 前端 暂无 王f ...
- 微信小程序实现tabs选项卡
选项卡在我们的日常开发中,使用的还是蛮多的,但是微信小程序中却没有直接提供选项卡组件,不过我们可以变通通过 scroll-view 和 swiper 组件来实现一个选项卡的功能. 需求: 实现一个选项 ...
- 乘风破浪,遇见上一代操作系统Windows 10 - 抢鲜尝试安装新微软商店(Microsoft Store)
背景 在微软官方文章的<十一项关于微软商店新知>中提到: 新的微软商店现在可在Windows 11上找到,我们很高兴地分享,它将在未来几个月内提供给Windows 10客户!我们将很快分享 ...
- 按照工业标准1英寸=25.4mm,而在电子元件成像领域Sensor尺寸1英寸=16mm。
按照工业标准1英寸=25.4mm,而在电子元件成像领域Sensor尺寸1英寸=16mm. 我们平常所说的CCD/CMOS的尺寸,实际上是指Sensor对角线的长度,这一点跟我们平常所说的屏幕尺寸是一样 ...
- PCB电路板元器件布局的一般原则*(转)
PCB电路板元器件布局的一般原则: 设计人员在PCB电路板布局过程中需要遵循的一般原则如下. (1)元器件最好单面放置.如果需要双面放置元器件,在底层(Bottom Layer)放置插针式元器件, ) ...
- 零基础小白要如何跟好的学习嵌入式Linux(转)
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...
- 关于dns服务工作的原理,和配置的细节理解。
dns服务器相关 1,dns原理,也就是迭代,和递归查询.将域名解析为ip的过程. 一次完整的查询请求经过的流程: Client -->hosts文件 -->DNS Service Loc ...
- Redis源码分析(intset)
源码版本:4.0.1 源码位置: intset.h:数据结构的定义 intset.c:创建.增删等操作实现 1. 整数集合简介 intset是Redis内存数据结构之一,和之前的 sds. skipl ...
- String你会用吗?
1. 如果不是在循环体中进行字符串拼接的话,直接使用 String 的 "+" 就好了. 2. 单线程循环中操作大量字符串数据 → StringBuilder.append() 3 ...