codeforce 1036 C. Classy Numbers(暴力dfs)

题意:优等数是非0数字的数目小于等于3的数字,给一个范围问你有多少优等数。

思路:时间3秒,考虑直接dfs把所有优等数全部求出,最后发现总共数目只有1万多,存入vector中,sort一下,直接用二分查找数目,相减即可。

这道题3个月之前做过一次,当时没做出来,看了题解,当时掌握了之后,现在重新打还是wa了2发。

我一开始用set存储,发现set不支持迭代器运算,就不能直接找到对应数目 - _ -!!!
网上查了一下,并不是所有stl容器都支持迭代器运算
能进行算术运算的迭代器只有随即访问迭代器,要求容器元素存储在连续内存空间里,vector,string,deque的迭代器是有加减法的,但是map,set,multimap,multiset的迭代器是没有加减法的,list也不可以

将set换成vector排序之后,要注意最后还有一个上界1e18 就可以直接用迭代器运算。

#include<bits/stdc++.h>
#define fi first
#define se second
#define FOR(a) for(int i=0;i<a;i++)
#define sc(a) scanf("%d",&a)
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef pair<P, int> LP;
const ll inf = 1e17 + 10;
const int N = 1e6 + 10;
const ll mod = 1000000007;
const int base=131;

map<string, int>ml;



ll b[N], vis[N], po[N],num[N], t, n, m, x, y, k, a[N];
ll ex, ey, cnt, ans, sum, flag;
ll hs[N];
ll dp[N];

vector<ll> v;
map<int,int> mp;
priority_queue<P> q;
priority_queue<P> tq;
string s;
set<ll> se;
void dfs(ll step,ll x,ll k)
{
	if(step>18||k>3) return ;
	else
	{
		v.push_back(x);
		if(k<3)
		{
			for(ll i=0;i<=9;i++)
			{
				dfs(step+1,x*10+i,k+(i!=0));
			}

		}
		else if(k==3) dfs(step+1,x*10,k);

	}

}

int main()
{


	ios::sync_with_stdio(false);
	cin.tie(0);

	for(int i=1;i<=9;i++)
	{
		dfs(1,i,1);
	}
	//show(se.size())
	v.push_back(1e18);
	sort(v.begin(),v.end());
	cin>>t;
	while(t--)
	{
		cin>>x>>y;

		cout<<upper_bound(v.begin(),v.end(),y)-lower_bound(v.begin(),v.end(),x)<<endl;

	}









}

猜你喜欢

转载自blog.csdn.net/weixin_42640692/article/details/86590601