D
这是一个环 每个点跑一遍lis找到最大 n-max就是答案

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int const N=505;
int n,dp[N],a[N],ans,ins;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
    }
    for(int i = 0;i < n;i ++)
    {
        memset(dp, 0, sizeof(dp));
        for(int j = 1;j <= n;j ++)
        {
            dp[j] = 1;
            for(int k = 1;k < j;k ++)
            {
                if(a[(i + j) % n + 1] > a[(i + k) % n + 1]) dp[j] = max(dp[j], dp[k] + 1);
            }
            ins = max(ins, dp[j]);
        }
        ans = max(ans, ins);
    }
    cout<<n-ans<<endl;
    return 0;
}

E
这是我们队的黄大佬用java写的 看伪代码找最小循环节

import java.util.*;
import java.math.BigInteger;
public class Main
{
    public static void main(String[] args)
    {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int[] a = new int[n+1];
        int[] vis = new int[n+1];
        BigInteger c = new BigInteger("1");
        BigInteger l = new BigInteger("1");
        for(int i=1;i<=n;++i)a[i] = s.nextInt();
        for(int i=1;i<=n;++i)
        {
            if(vis[i] != 0)continue;
            int x = a[i];
            BigInteger tot = new BigInteger("0");
            do
            {
                vis[x] = tot.intValue();
                x = a[x];
                tot = tot.add(l);
            }
            while(vis[x] == 0&&x != a[i]);
            if(vis[x] != 0)tot.add(new BigInteger(String.valueOf(vis[x])));
            c = c.multiply(tot).divide(c.gcd(tot));
        }
        System.out.println(c);
    }
}

F
简单的模拟 看懂题意就行

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int nextInt()
{
    char c = getchar();
    int x = 0,fh = 0;
    while(c < '0' || c > '9'){fh |= c == '-';c = getchar();}
    while(c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}
    return fh?-x:x;
}

signed main()
{
    int n = nextInt();
    int a[101],maxa = 0;
    for(int i=1;i<=n;++i)maxa = max(maxa,a[i] = nextInt());
    for(int i=1;i<=n;++i)
    {
        int t = ceil(50.0*a[i]/maxa);
        cout<<'+';for(int i=1;i<=t;++i)cout<<"-";cout<<'+'<<endl;
        cout<<'|';
        if(a[i] == maxa)
        {
            for(int i=1;i<=t-1;++i)cout<<' ';
            cout<<'*';
        }
        else
            for(int i=1;i<=t;++i)cout<<' ';
        cout<<'|'<<a[i]<<endl;
        cout<<'+';for(int i=1;i<=t;++i)cout<<"-";cout<<'+'<<endl;
    }
    return 0;
}

I
在无穷大的平面上 每个特殊点必定会对4个基地点产生贡献 有两种特殊点
所以答案是2/3

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int main()
{
    ios::sync_with_stdio(false);
    double ans=2.0/3;
    printf("%.6f",ans);
    return 0;
}

具体看代码理解