博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5898 odd-even number
阅读量:5135 次
发布时间:2019-06-13

本文共 3387 字,大约阅读时间需要 11 分钟。

题目:odd-even number

链接:

题意:给一个条件,问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
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
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_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 else133 {134 if(pre == 1 && p1 % 2 == 1 );135 else ret += dfs(0,0,p2+1,i);136 }137 }138 for(int j=1;j

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

你可能感兴趣的文章
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
Wpf 之Canvas介绍
查看>>
linux history
查看>>