列表

详情


NC240153. 一道难题

描述

给定一个数字 n,求出 1-n 中 只由 01 组成的,且至少有三个 1 相连的数(不含前导零)有多少个。

输入描述

第一行一个整数 

输出描述

一个整数,表示满足条件的数的个数。

示例1

输入:

2001

输出:

3

说明:

1-2001 中,满足条件的数有:111,1110,1111

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 726ms, 内存消耗: 492K, 提交时间: 2022-09-18 20:33:50

#include<bits/stdc++.h>
using namespace std;
string s;
int cnt=0;
void dfs(string t,int x,int flag ) {
	if(t.size()>s.size()||(t.size()==s.size()&&t>s))
		return;
	if(x>=3)flag=1;
	if(x>=3||flag)
		cnt++;
	dfs(t+'0',0,flag);
	dfs(t+'1',x+1,flag);
}
int main(){
	cin>>s;
	dfs("1",1,0);
	cout<<cnt;
}

pypy3 解法, 执行用时: 1188ms, 内存消耗: 50252K, 提交时间: 2022-09-20 23:33:07

import sys

sys.setrecursionlimit(3000)
ans=0
n=input()
def dfs(s,num,flag):
    global ans,n
    if len(s)>len(n) or len(s)==len(n) and s>n:
        return
    if num>=3:
        flag=1
    if flag:
        ans+=1
    dfs(s+'0',0,flag)
    dfs(s+'1',num+1,flag)

dfs('1',1,0)
print(ans)

C++(g++ 7.5.0) 解法, 执行用时: 770ms, 内存消耗: 504K, 提交时间: 2022-09-25 22:45:16

#include<bits/stdc++.h>
using namespace std;
int c;string b;
void d(string a,int t,int o){
  if(a.size()>b.size()||a.size()==b.size()&&a>b)return;
  c+=o|=t>2;d(a+'0',0,o),d(a+'1',t+1,o);
}
int main(){cin>>b;d("1",1,0);cout<<c;}

上一题