https://vjudge.net/problem/ZOJ-3962

题意:有16种灯,每种灯的花费是灯管数目,代表0~F(十六进制),现在从x开始跳n-1秒,每一秒需要的花费是表示当前的数的花费之和,问n-1秒后这段时间的花费总共是多少。跳到FFFFFFFF之后会跳回00000000.

思路:怀疑人生的题目。如果从平时计算[L,R]的花费,就计算[0,R] - [0,L-1]这样的角度来看,就会好做很多。同样如果跳到1LL<<32之后回到0,也分段考虑。这样写一个函数就可以计算了。

考虑三种东西:

a:跑第i位的时候总共完整跑了几轮的贡献(即0~F)。

b:跑第i位的时候完整跑完之后还剩了多余的几轮的贡献(即0~bit[i])。

c:跑第i位的时候跑完a和b之后还剩一些多余的秒,这个时候显示器是显示bit[i]的,因此要加上bit[i]*剩余的秒。

a和b每次都停留了1LL<<(4 * i)秒。因此都要乘上这个权。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL MOD = 1LL << 32;
 5 int w[] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6, 6, 5, 4, 5, 5, 4 };
 6 LL sum[20];
 7
 8 LL solve(LL x) {
 9     if(x < 0) return 0;
10     LL pw = 1, ans = 0;
11 //    printf("x : %lld \n", x);
12     for(int i = 1; i <= 8; i++, pw <<= 4) {
13         LL a = x / (pw * 16) * sum[16]; // 这一位总共完整跑了几轮
14         LL b = sum[x / pw % 16]; // 跑完a轮后还有剩余b次
15         LL c = (x % pw + 1) * w[x / pw % 16]; // 当前的这一位的这一个数要多加几次,0也算一个所以+1
16         ans += (a + b) * pw + c; // a和b每次都会停留pw秒
17     }
18     return ans;
19 }
20
21 int main() {
22     sum[0] = 0;
23     for(int i = 1; i <= 16; i++) sum[i] = sum[i-1] + w[i-1];
24     int t; scanf("%d", &t);
25     while(t--) {
26         LL n, x;
27         scanf("%lld%llx", &n, &x);
28         if((x + n - 1) >= MOD) { // 分成 x 到 FFFFFFFF 和 0 到 (x + n - 1) % MOD
29             printf("%lld\n", solve(MOD - 1) - solve(x - 1) + solve(x + n - 1 - MOD));
30         } else {
31             printf("%lld\n", solve(n + x - 1) - solve(x - 1));
32         }
33     }
34     return 0;
35 }
36 /*
37 3
38 5 89ABCDEF
39 3 FFFFFFFF
40 7 00000000
41 */

转载于:https://www.cnblogs.com/fightfordream/p/6764475.html

ZOJ 3962:Seven Segment Display(思维)相关推荐

  1. ZOJ 3962 Seven Segment Display(数位DP)题解

    题意:给一个16进制8位数,给定每个数字的贡献,问你贡献和. 思路:数位DP,想了很久用什么表示状态,看题解说用和就行,其他的都算是比较正常的数位DP. 代码: #include<iostrea ...

  2. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  3. TM1637芯片驱动数码管 – play with TM1637 seven segment display driver

    因为一个项目要使用到数码管,所以今天研究了一下TM1637这款数码管驱动芯片,在这里做个记录,方便以后使用时参考. 最初以为芯片是I2C通信,想将几块不同的芯片挂在同一个I2C总线上,然后开始了研究. ...

  4. Seven Segment Display

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3962 题解:数位DP /* *@Author: STZG *@Langua ...

  5. 【ZOJ - 4033】CONTINUE...? (思维,整体思想,分组思想)

    题干: DreamGrid has  classmates numbered from  to . Some of them are boys and the others are girls. Ea ...

  6. 语音识别项目报告.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp中学教育&nbsp>&nbsp中学课件 语音识别项目报告.pdf61页 本文档一共被下载:次 ...

  7. STM32CUBEMX 配置12脚3641BS以及串口显示RTC时间

    最近在学习STM32F4系列的RTC时钟系统,同时也在学习4位7段数码管显示驱动.而市面上很多3641BS数码管都是集成了74HC595移位寄存器芯片的PCB板,故网上大多基于STM32驱动该型号数码 ...

  8. Nexys2七段LED显示操作

    首先,翻译一下使用手册上的说明: Nexys2开发板包含四位公共阳极七段LED显示屏. 每一个数字由按数字"8"图案排列的七个片段组成,其中嵌入有LED灯. 每段LED可以单独点亮 ...

  9. 生产实习(制作温度计)

    作业要求:焊接电路板,编译代码,并且上传到onenet平台并且显示器能够显示温度. 先展示一下最终结果: onenet平台: 串口监视器: 实物图: 感想:首先,焊接电路板感觉挺有意思的,也比较简单. ...

最新文章

  1. 软件需求阅读笔记之三
  2. 《JAVA与模式》之工厂方法模式
  3. Win server 2012 R2 文件服务器--(三)配额限制
  4. 奇怪的问题,.Net 2.0发送邮件失败...
  5. Apollo自动驾驶入门课程第②讲 — 高精地图
  6. 详解nohup和 区别
  7. Python | 查找字符串中每个字符的频率
  8. 学习Mysql (一)
  9. STM32|4-20mA输出电路
  10. java集合之列表:ArrayList、Vector、LinkedList
  11. .NET中获取电脑名、IP地址及用户名方法
  12. ATLAS.ti 9(质性研究分析软件)官方中文版V9.0.20.0 | 质性分析软件Atlas.ti下载 | atlas软件是什么软件
  13. JDK10 新特性详解
  14. 艾默生黑色无线电池701PBKKF
  15. Teams 的 Meeting App
  16. 如何解决chrome浏览器地址栏变黑色(chrome搜索栏变黑)(mac电脑)
  17. html中颜色打字机效果,Css打字机效果
  18. 程序员在群里“匿名”骂老板,第二天被开除,聊天记录曝光
  19. PV270R1K1T1NMMC派克柱塞泵_应用
  20. 视频接口CVBS/Component/BNC/VGA/DVI/HDMI/SDI/DP/Type-C

热门文章

  1. Vue-admin工作整理(四):路由组件传参
  2. 【PyCharm疑问】在pycharm中带有中文时,有时会导致程序判断错误,是何原因?...
  3. 类库,通用变量,is/as运算符,委托。
  4. Java Servlet生成JSON格式数据并用jQuery显示
  5. [评论]为什么中国的程序员技术偏低
  6. 最新卡通渲染效果图(附带一张次世代帅哥)
  7. spring boot Redis使用
  8. 戴尔发布面向制造、生命科学和研究的高性能计算系统
  9. 学习日志-中缀表达式转后缀表达式并计算结果
  10. CentOS安装SVN服务器并配置HTTPS连接