2020.11.01天梯赛练习

题目:连续因子

思路:

这题就是问 n 存在的最长连续因子,当这个 n 为素数时,那答案长度肯定为1,就是它本身;另外的情况,可以通过遍历寻找不断更新最长的连续素数情况。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 1e5 + 4;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)

int main(){
    ll n;
    ll f,sum = 0;
    cin >> n;
    for(ll i = 2;i * i <= n;i++){
        if(n % i != 0){
            continue;
        }
        ll maxl = 0,j = i,tempn = n;
        while(tempn % j == 0){
            tempn /= j;
            maxl++;
            j++;
        }
        if(sum < maxl){
            sum = maxl;
            f = i;
        }

    }
    if(sum == 0){
        cout << 1 << endl << n << endl;
    }
    else{
        cout << sum << endl;
        for(int i = 0;i < sum;i++){
            if(i == 0){
                cout << f+i;
            }
            else
                cout << "*" << f+i;
        }
        cout << endl;
    }


    return 0;
}

题目:功夫传人

思路:

这道题梳理完题意后,你便会想到用递归的方法来处理比较容易,从祖师爷往下的后辈分进行遍历,每次分情况进行削减或翻倍,将每个人的徒弟存进一个数组,再用一个数组记录得道者的倍率,在递归中找到所有得道者的功力,将最后的求和输出即可。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 1e5 + 4;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
vector<int> child[100100];
int expand[100100];
double sum, z,r;

void dfs(int f, double v){
    if(expand[f]){
        sum += v*expand[f];
    }
    else{
        for(int i = 0;i < child[f].size();i++){
            dfs(child[f][i],r*v);
        }
    }
}
int main(){

    int n;

    cin >> n >> z >> r;
    r = (100-r)/100;
    for(int i = 0;i < n;i++){
        int x;
        cin >> x;
        if(x == 0){
            cin >> expand[i];
        }
        else{
            for(int j = 0;j < x;j++){
                int m;
                cin >> m;
                child[i].push_back(m);
            }
        }
    }
    dfs(0,z);
    printf("%d\n",(int)sum);
    return 0;
}

 

posted @ 2020-11-07 14:51  emhhbw==  阅读(96)  评论(0)    收藏  举报