2020牛客多校第五场补题

D Drop Voicing

队友过的,在环上找最大上升子序列
明天理解一下

E Bogo Sort

置换求环 + 大整数 + lcm
就是求出这个置换有多少环,然后对这些环的大小进行求lcm
对于置换求环

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5 + 5;
int p[N], ans[N], cnt;
bool vis[N];
int main(){
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        cin >> p[i]; // 置换
    for(int i = 1; i <= n; i++) {
        if(vis[i]) continue;
        int tmp = i, tot = 0;
        while(vis[tmp] == 0) { //沿着置换遍历 
            vis[tmp] = 1;
            tmp = p[tmp];
            tot++;
        }
        ans[++cnt] = tot; // 第cnt个环的大小
    }
    return 0;
}

好像在java里,new一个BIgInteger比较慢,但是直接调用one,ten的大整数快

import java.math.BigInteger;
import java.util.*;
public class Main {
    static int p[] = new int[100010];
    static int num[] = new int[100010];
    static boolean vis[] = new boolean[100010];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), cnt = 0;
        for(int i = 1; i <= n; i++) {
            p[i] = in.nextInt();
        }
        BigInteger mod = BigInteger.ONE;
        for(int i = 1; i <= n; i++) {
            mod = mod.multiply(BigInteger.TEN);
            if(vis[i]) continue;
            int tmp = i, tot = 0;
            while(!vis[tmp]) {
                vis[tmp] = true;
                tmp = p[tmp];
                tot++;
            }
            num[++cnt] = tot;
        }
        BigInteger ans = new BigInteger(String.valueOf(num[1]));
        for(int i = 1; i <= cnt; i++) {
            BigInteger g = ans.gcd(new BigInteger(String.valueOf(num[i])));
            ans = ans.multiply(new BigInteger(String.valueOf(num[i])));
            ans = ans.divide(g);
        }
        System.out.println(ans.mod(mod));
        in.close();
    }
}

F DPS

简单模拟一下就可以了

#include <iostream>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
ll a[105];
void print(int n, int f){
    cout << "+";
    for(int i = 1; i <= n; i++)
        cout << '-';
    cout << "+" << endl;
}
void pr22(int n, int f, int x){
    cout << "|";
    if(f == 1) n = n - 1;
    for(int i = 1; i <= n; i++)
        cout << " ";
    if(f == 1) cout << "*";
    cout << "|";
    cout << x << endl;
}
int main(){
    int n;
    cin >> n;
    ll maxx = 0;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        maxx = max(maxx, a[i]);
    }
    for(int i = 1; i <= n; i++) {
        ll x = ceil(a[i] * 50.0 / maxx);
        print(x, a[i] == maxx);
        pr22(x, a[i] == maxx, a[i]);
        print(x, a[i] == maxx);
    }
    return 0;
}

I Hard Math Problem

答案是2.0/3.0,待补题

猜你喜欢

转载自www.cnblogs.com/Emcikem/p/13378038.html