题目:odd-even number

链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5898

题意:给一个条件,问l 到r 之间有多少满足条件的数,条件是:连续的奇数长度为偶数,连续的偶数长度为奇数,比如124683,连续的奇数(1、3)长度都是1(奇数),连续的偶数(2468)长度为4(偶数),所以不满足条件。

思路:

  很明显的数位dp,可以用dfs做,传下三个参数(pre、p1、p2、ceng),pre表示前一位的数是奇数还是偶数,p1表示前面连续的奇数个数,p2表示前面连续的偶数的个数(p1、p2至少有一个为0),ceng表示还需dfs几位。如果ceng是0,那就判断,pre是偶数p2为奇数、pre是奇数p1是偶数返回1,否则返回0。如果ceng不为0,则分情况递归,比如pre为1且p1为奇数,则这一位不能选择偶数......

  然后就是根据具体的数调用dfs求数量。

  注意:区间超过longlong,要用字符串存。

AC代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<math.h>
  5 #include<set>
  6 #include<map>
  7 #include<list>
  8 #include<stack>
  9 #include<queue>
 10 #include<vector>
 11 #include<string>
 12 #include<iostream>
 13 #include<algorithm>
 14 using namespace std;
 15 #define lson rt<<1
 16 #define rson rt<<1|1
 17 #define N 20020
 18 #define M 100010
 19 #define Mod 1000000007
 20 #define LL long long
 21 #define INF 0x7fffffff
 22 #define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
 23 #define For(i,f_start,f_end) for(int i=f_start;i<f_end;i++)
 24 #define REP(i,f_end,f_start) for(int i=f_end;i>=f_start;i--)
 25 #define Rep(i,f_end,f_start) for(int i=f_end;i>f_start;i--)
 26 #define MT(x,i) memset(x,i,sizeof(x))
 27 #define gcd(x,y) __gcd(x,y)
 28 const double PI = acos(-1);
 29
 30 LL dfs(int pre,int p1,int p2,int ceng)
 31 {
 32   if(ceng == 0)
 33   {
 34     if(p1==0 && p2==0) return 1;
 35     else if(pre==0 && p2%2==1) return 1;
 36     else if(pre==0) return 0;
 37     else if(pre==1 && p1%2==0) return 1;
 38     else return 0;
 39   }
 40   LL ret;
 41   if(p1==0 && p2==0){
 42     ret = dfs(0,0,0,ceng-1);
 43     ret += dfs(0,0,p2+1,ceng-1)*4;
 44     ret += dfs(1,p1+1,0,ceng-1)*5;
 45
 46   }
 47   else if(pre==0 && p2%2==0){
 48     ret=dfs(0,0,p2+1,ceng-1);
 49     ret = ret * 5;
 50   }
 51   else if(pre==0 && p2%2==1){
 52     ret=dfs(0,0,p2+1,ceng-1)*5;
 53     ret+=dfs(1,p1+1,0,ceng-1)*5;
 54   }
 55   else if(pre==1 && p1%2==1){
 56     ret=dfs(1,p1+1,0,ceng-1)*5;
 57   }
 58   else if(pre==1 && p1%2==0){
 59     ret=dfs(1,p1+1,0,ceng-1)*5;
 60     ret+=dfs(0,0,p2+1,ceng-1)*5;
 61   }
 62   return ret;
 63 }
 64
 65 bool ok(char *x)
 66 {
 67   if(x[0]=='0' && x[1]==0) return true;
 68   int pre = 0, p1 = 0, p2 = 0;
 69   int len=strlen(x)-1;
 70   while(len>=0)
 71   {
 72     int tmp = (x[len]-'0')%2;
 73     if(p1==0 && p2==0);
 74     else if(tmp == 0 && pre==1 && p1%2==1) return false;
 75     else if(tmp == 1 && pre==0 && p2%2==0) return false;
 76     if(tmp == 0 ) p2++,p1=0;
 77     else p1++,p2=0;
 78     pre=tmp;
 79     len--;
 80   }
 81   if(pre==0 && p2%2==0) return false;
 82   if(pre==1 && p1%2==1) return false;
 83   return true;
 84 }
 85
 86 bool ok(int x)
 87 {
 88   if(x==0) return true;
 89   int pre = 0, p1 = 0, p2 = 0;
 90   while(x)
 91   {
 92     int tmp = x%10%2;
 93     if(p1==0 && p2==0);
 94     else if(tmp == 0 && pre==1 && p1%2==1) return false;
 95     else if(tmp == 1 && pre==0 && p2%2==0) return false;
 96     if(tmp == 0 ) p2++,p1=0;
 97     else p1++,p2=0;
 98     pre=tmp;
 99     x/=10;
100   }
101   if(pre==0 && p2%2==0) return false;
102   if(pre==1 && p1%2==1) return false;
103   return true;
104 }
105
106 LL solve(char *x)
107 {
108   LL ret = 0;
109   if(ok(x)){
110     ret++;
111   }
112   int bt[100],bo=0;
113   while(x[bo])
114   {
115     bt[bo]=x[bo]-'0';
116     bo++;
117   }
118   int tmp = 0;
119   while(tmp<=(bo-1)/2){
120     int tt = bt[tmp];
121     bt[tmp]=bt[bo-tmp-1];
122     bt[bo-tmp-1]=tt;
123     tmp++;
124   }
125   int pre = 0, p1 = 0, p2 = 0;
126   for(int i=bo-1;i>=0;i--)
127   {
128     if(bt[i]>0)
129     {
130       if(p1 == 0 && p2==0)
131         ret += dfs(pre,0,0,i);
132       else
133       {
134         if(pre == 1 && p1 % 2 == 1 );
135         else ret += dfs(0,0,p2+1,i);
136       }
137     }
138     for(int j=1;j<bt[i];j++)
139     {
140       if(j%2==1){
141         if((p1!=0 || p2!=0) && pre == 0 && p2 % 2 == 0) continue;
142         else ret += dfs(1,p1+1,0,i);
143       }
144       else
145       {
146         if(pre == 1 && p1 % 2 == 1) continue;
147         ret += dfs(0,0,p2+1,i);
148       }
149     }
150     if(p1==0 && p2==0);
151     else if(bt[i]%2==0 && pre==1 && p1%2==1) break;
152     else if(bt[i]%2==1 && pre==0 && p2%2==0) break;
153     pre = bt[i]%2;
154     if(pre==0) p2++,p1=0;
155     else p1++,p2=0;
156   }
157   return ret;
158 }
159
160 int main()
161 {
162   int t;
163   char l[100],r[100];
164   int cas=1;
165   scanf("%d",&t);
166   while(t--){
167     scanf("%s%s",l,r);
168     printf("Case #%d: ",cas++);
169     printf("%I64d\n",solve(r)-solve(l)+(ok(l)?1:0));
170   }
171   return 0;
172 }

转载于:https://www.cnblogs.com/hchlqlz-oj-mrj/p/5882668.html

HDU 5898 odd-even number相关推荐

  1. hdu 5062 Beautiful Palindrome Number(水题)

    题目链接:hdu 5062 Beautiful Palindrome Number 题目大意:略. 解题思路:暴力或者手算都可以,注意手算的话,分别算出1,2,3...位的情况后,答案是累加上去的. ...

  2. 【HDU - 1266 】Reverse Number(模拟,数字分位数处理)

    题干: Welcome to 2006'4 computer college programming contest! Specially, I give my best regards to all ...

  3. HDU 1394 Minimum Inversion Number(线段树的单点更新)

    点我看题目 题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆 ...

  4. 【HDU - 2665】Kth number(区间第K大,主席树,模板)

    题干: Give you a sequence and ask you the kth big number of a inteval. Input The first line is the num ...

  5. 【HDU - 6231】K-th Number(二分,思维)

    题干: Alice are given an array A[1..N]A[1..N] with NN numbers. Now Alice want to build an array BB by ...

  6. HDU 3943 K-th Nya Number(数位DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3943 题目大意:求出区间 (P,Q] 中找到第K个满足条件的数,条件是该数包含X个4和Y个7 Samp ...

  7. HDU - 1394 Minimum Inversion Number(树状数组)

    题目链接:点击查看 题目大意:线段树求逆序数,给出的数列可以组成环,问怎么样求可以让逆序数最小,输出最小值 题目分析:看到这个题的第一反应是暴力枚举5000种情况,因为感觉这个题的N给的不是很大,但是 ...

  8. (HDU - 3709)Balanced Number(数位DP)

    题目链接:Problem - 3709 题意:给定区间[a,b],求区间内平衡数的个数.所谓平衡数即有一位做平衡点,左右两边数字的力矩相等. 分析,这道题我们直接对平衡点进行枚举即可,然后分别求出来每 ...

  9. HDU - 2619 Love you Ten thousand years

    Love you Ten thousand years------Earth's rotation is a day that is the representative of a day I lov ...

最新文章

  1. jQuery 实战读书笔记之第四章:使用特性、属性和数据
  2. 玩转springboot:实现springboot自定义拦截器
  3. solaris 10安装mysql5
  4. JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
  5. 点击事件为什么会失效_Spring事务原理?事务在方法间如何传播?为什么会失效?...
  6. Linux 常用命令整理
  7. PHP商城源码|好看的团购拼购商城源码
  8. [译] Ruby 2.6 String的split 方法支持代码块执行
  9. plc和pc串口通讯接线_PC与PLC的串口通信及编程实现
  10. linspace函数matlab_MATLAB用不同颜色绘制多条曲线
  11. python 最准确的图片转文字软件_图片转文字软件哪个好用?免费的图片转文字软件...
  12. 使用layui实现表格制作
  13. Python打印2018年的日历(【问题描述】 打印2018年的日历 【输入形式】 【输出形式】 【样例输入】 【样例输出】)
  14. ERA5气象数据 :数据中相对湿度、边界层高度、温度、风向、地面气压等参数下载详细教程
  15. w8ndows 秒表,关闭 Windows Search,Win8 能变快?
  16. 北师大19秋计算机在线1,北师19秋《专科英语(二)》在线作业1【满分答案】
  17. c语言贪心算法找零问题,贪心算法-找零问题-实验报告
  18. JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗?
  19. jeecgboot初学习疑问与总结--2021-05-11
  20. realpath函数使用注意事项

热门文章

  1. android中进行https连接的方式的详解
  2. 加强网站安全、重构公司的门户网站项目(C# VS2003)
  3. python123第四周作业_科学计算和可视化
  4. sublime text c++ mac 怎么用_Mac 地址是什么,怎么用
  5. spring boot 支持多少人在线_通过 spring-boot-starter-hbase 集成 HBase
  6. 鼓励玩家自创,大量的UGC能为手游续命吗?
  7. Unity4.3 2D新特性
  8. C# WinForm开发系列
  9. dao generator for php and mysql_mybatis generator 自动生成dao层映射代码
  10. apache缺省banner_NSFOCUS建议您采取以下措施以降低威胁: * 修改源代码或者配置文件改变SSH服务的缺省banner。...