一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
O(n)
#include<cstdio>#include<cstring>#include<algorithm>usingnamespace std;int n, ans;boolok(int x){int t =10;while(x){int d = x %10;if(d > t)returnfalse;
t = d;
x /=10;}returntrue;}intmain(){scanf("%d",&n);for(int i =1; i <= n; i++){if(ok(i)) ans++;}printf("%d", ans);return0;}
六
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
O(n2)
#include<cstdio>#include<cstring>#include<algorithm>usingnamespace std;constint N =1005;int n, p[N], ans;boolok(int x){bool ok =false;for(int i = x -1; i >=1; i--){if(p[i]< p[x]){
ok =true;break;}}if(!ok)returnfalse;for(int i = x +1; i <= n; i++){if(p[x]< p[i])returntrue;}returnfalse;}intmain(){scanf("%d",&n);for(int i =1; i <= n; i++){scanf("%d",&p[i]);}for(int i =1; i <= n; i++){if(ok(i)) ans++;}printf("%d", ans);return0;}
七、
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
O(n)
#include<cstdio>#include<cstring>#include<algorithm>usingnamespace std;constint N =105;int n;char s[N], h[5]={'a','e','i','o','u'};boolok(int x){for(int i =0; i <5; i++){if(h[i]== s[x])returntrue;}returnfalse;}boolsolve(){
n =strlen(s +1);//找第一段int t =1;for(; t <= n; t++){if(ok(t)){break;}}//找第二段if(t >= n || t ==1)returnfalse;for(; t <= n; t++){if(!ok(t)){break;}}//找第三段if(t >= n)returnfalse;for(; t <= n; t++){if(ok(t)){break;}}//找第四段if(t > n)returnfalse;for(; t <= n; t++){if(!ok(t)){break;}}if(t == n +1)returntrue;returnfalse;}intmain(){scanf("%s", s +1);if(solve())printf("yes");elseprintf("no");return0;}