博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

题解 [51nod1385] 凑数字

题面

解析

首先设\(n\)\(l\)位,

那么对于前\(l-1\)位,\(0\)~\(9\)都是要选上的,

而对于最高位上的数\(x\),\(1\)~\(x-1\)也是要选上的.

到这里就有了\(10*(l-1)+x-1\)

而我们还要考虑最高位的数\(x\)能不能省(比如说样例就能省).

设一个数\(sum\)\(l\)位,每一位都为\(x\),

如果省掉的话,我们能表示的数就一定小于\(sum\),

因为\(sum\)有一位一定表示不出.

因此我们只需要判断\(n\)\(sum\)的大小关系即可.

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#define filein(a) freopen(a".cpp","r",stdin)
#define fileout(a) freopen(a".cpp","w",stdout);
using namespace std;

inline int read(){
	int sum=0,f=1;char c=getchar();
	while((c<'0'||c>'9')&&c!=EOF){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'&&c!=EOF){sum=sum*10+c-'0';c=getchar();}
	return sum*f;
}

const int N=100001;
int n,m;
char s[N];

int main(){
	cin>>s;n=strlen(s);
	int ans=(n-1)*10+s[0]-'1',ok=1;
	for(int i=0;i<n-1;i++){
		if(s[i+1]<s[i]){ok=0;break;}
		else if(s[i+1]>s[i]) break;
	}
	ans+=ok;
	printf("%d\n",ans);
	return 0;
}

posted @ 2019-08-25 20:59  Hastin  阅读(152)  评论(0编辑  收藏  举报