Educational Codeforces Round 50 (Rated for Div. 2) C、D

C - dfs

题目链接http://codeforces.com/contest/1036/problem/C

题意:问区间[l,r]中有多少个数符合:组成它的数字中不为0的数字不超过3个

思路:

用dfs先预处理,把[1,1e18]中符合的数都加进去,然后输入边界后判断

代码如下:


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<string>
#include<cstring>
using namespace std;
#define ll long long
const int N=300005;
vector<ll>v;
void dfs(ll now,ll cnt){//当前数是now,cnt是非0是的个数
    if(now>1e18||cnt>3)return ;
    v.push_back(now);
    for(int i=0;i<10;i++){
        ll k=now*10+i;
        if(k>0&&k<=1e18)dfs(k,cnt+!!i);//若i不是0,则cnt+1,反之cnt不变
    }
}

int main(){
    int t;
    ll left,right;
    scanf("%d",&t);
    dfs(0,0);//把区间[1,1e18]中符合要求的数都放到容器里
    sort(v.begin(),v.end());
    while(t--){
        scanf("%lld%lld",&left,&right);
        ll num=upper_bound(v.begin(),v.end(),right)-lower_bound(v.begin(),v.end(),left);
        printf("%lld\n",num);
    }
}

D - 前缀和

题意:

给你两个数组,把他们划分成每一段都相同的样子,求划分完后最大的段数

思路:

我们再开两个数组表示数字的前缀和,当前缀和相等时说明,这个数到它前面的数(一直到上一个前缀和相等的数)需要合并

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<string>
#include<cstring>
using namespace std;
#define ll long long
const int N=300005;
ll a[N],b[N];
ll a1[N],b1[N];
int main(){
    int n,m;
    while(scanf("%d",&n)!=EOF){
        ll sum1=0,sum2=0;
        memset(a1,0,sizeof(a1));
        memset(b1,0,sizeof(b1));
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum1+=a[i];
            a1[i]=(a1[i-1]+a[i]);
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%d",&b[i]);
            sum2+=b[i];
            b1[i]=(b1[i-1]+b[i]);
        }
        if(sum1!=sum2){
            printf("%d\n",-1);
            continue;
        }
        ll ans=n;int now=1;
        for(int i=1;i<=n;i++){
            ll p=*lower_bound(b1+1,b1+1+m,a1[i]);
            if(p!=a1[i])continue;
            ans-=(i-now);
            now=i+1;
        }
        printf("%lld\n",ans);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/82633426