zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 19 题解【ABCDE】

    A. k-Factorization

    题意:给你一个n,问你这个数能否分割成k个大于1的数的乘积。

    题解:因为n的取值范围很小,所以感觉dfs应该不会有很多种可能……

    #include<bits/stdc++.h>
    using namespace std;
    
    long long n;
    int k;
    vector<int> ans;
    void dfs(int x,long long now,int st){
        if(x==k&&now==n){
            for(int i=0;i<ans.size();i++){
                cout<<ans[i]<<" ";
            }
            cout<<endl;
            exit(0);
        }
        for(int i=st;i<=n;i++){
            if(i*now>n)break;
            ans.push_back(i);
            dfs(x+1,now*i,i);
            ans.pop_back();
        }
    }
    int main(){
        cin>>n>>k;
        dfs(0,1,2);
        cout<<"-1"<<endl;
    }
    

    B. Odd sum

    题意:让你找到一个子序列,要求和为奇数,且和最大。

    题解:首先让所有正数都加起来,如果答案此时为奇数,直接输出。否则你要么减去一个正奇数,要么加上一个负奇数。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+7;
    long long a[maxn];
    int n;
    long long sum = 0;
    int main(){
        scanf("%d",&n);
        long long Tmp = 1e18;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]>0)sum+=a[i];
            if(abs(a[i])%2==1)Tmp=min(Tmp,abs(a[i]));
        }
        if(sum%2==1)cout<<sum<<endl;
        else cout<<sum-Tmp<<endl;
    }
    

    C. Minimal string

    题意:你有一个串s,你有两个操作。第一个操作是从s的开头扔一个串到t的结尾。第二个操作是扔t的结尾到u的结尾。

    问你怎么操作,才能使得u的字典序最小。

    题解:贪心,记录后缀最小值。如果当前t存的已经是后缀最小值的最小了,那就直接输出就好了。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+7;
    char s[maxn],t[maxn],u[maxn],mn[maxn];
    int main(){
        scanf("%s",s);
        int len = strlen(s);
        mn[len]='z'+1;
        int len2 = 0;
        for(int i=len-1;i>=0;i--)
            mn[i]=min(mn[i+1],s[i]);
        int len3 = 0;
        for(int i=0;i<len;i++){
            t[len2++]=s[i];
            while(len2&&t[len2-1]<=mn[i+1])
                u[len3++]=t[--len2];
        }
        printf("%s
    ",u);
    }
    

    D. Broken BST

    题意:给你一个二叉树,让你用题目中的代码(搜索二叉树)去找每一个节点的值,问你哪些值找不到。

    题解:就模拟就好了。唯一的坑点就是节点的val会有相同的情况,这种只需要找到val一样的点就好,并不需要找到同样的那个点。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+7;
    int n,v[maxn],l[maxn],r[maxn];
    int ans,vis[maxn];
    set<int> S;
    void dfs(int x,int L,int R){
        if(L<v[x]&&v[x]<R){
            S.insert(v[x]);
        }
        if(l[x]!=-1)dfs(l[x],L,min(R,v[x]));
        if(r[x]!=-1)dfs(r[x],max(L,v[x]),R);
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&v[i],&l[i],&r[i]);
            if(l[i]!=-1)vis[l[i]]++;
            if(r[i]!=-1)vis[r[i]]++;
        }
        for(int i=1;i<=n;i++){
            if(vis[i]==0){
                dfs(i,-2e9,2e9);
            }
        }
        for(int i=1;i<=n;i++)
            if(S.find(v[i])!=S.end())
                ans++;
        cout<<n-ans<<endl;
    }
    

    E. Array Queries

    题意:给你n个数a[i]。然后q个询问,每个询问给你一个p和k,每次p = p + a[p] + k,直到p>n,问你会经过多少步。

    题解:根据k分块即可,小于sqrt的dp预处理,否则直接暴力……

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+7;
    int a[maxn],n;
    int b[maxn][350];
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=n;i>=1;i--){
            for(int j=1;j<350;j++){
                if(i+j+a[i]>n)b[i][j]=1;
                else b[i][j]=b[i+a[i]+j][j]+1;
            }
        }
        int q;scanf("%d",&q);
        for(int i=1;i<=q;i++){
            int x,y;scanf("%d%d",&x,&y);
            if(y<350)printf("%d
    ",b[x][y]);
            else{
                int ans = 0;
                int now = x;
                while(now<=n){
                    ans = ans + 1;
                    now = now + a[now] + y;
                }
                printf("%d
    ",ans);
            }
        }
    }
  • 相关阅读:
    腾讯2014年实习生招聘笔试面试经历
    Unity MVC框架 StrangeIoC
    Android入门第八篇之GridView(九宫图)
    拓扑排序
    C:打印菱形(自己的方法)
    JSP中Session的使用
    继承Application实现Android数据共享
    使用Java高速实现进度条
    首次启动优美新手指引tip
    递归算法
  • 原文地址:https://www.cnblogs.com/qscqesze/p/6718888.html
Copyright © 2011-2022 走看看