zoukankan      html  css  js  c++  java
  • Codeforces 931 概率DP

    A

    #include <bits/stdc++.h>
    #define PI acos(-1.0)
    #define mem(a,b) memset((a),b,sizeof(a))
    #define TS printf("!!!
    ")
    #define pb push_back
    #define inf 1e9
    //std::ios::sync_with_stdio(false);
    using namespace std;
    //priority_queue<int,vector<int>,greater<int>> que; get min
    const double eps = 1.0e-10;
    const double EPS = 1.0e-4;
    typedef pair<int, int> pairint;
    typedef long long ll;
    typedef unsigned long long ull;
    //const int maxn = 3e5 + 10;
    const int  maxm = 300;
    const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}};
    //priority_queue<int, vector<int>, less<int>> que;
    //next_permutation
    ll mod = 3e7;
    const int maxn = 200005;
    int main()
    {
            int n, m;
            while (cin >> n >> m)
            {
                    int mid = (n + m) / 2;
                    //cout<<mid<<endl;
                    int x1 = abs(mid - n);
                    int x2 = abs(m - mid);
                    int ans = (1 + x1) * x1 / 2 + (1 + x2) * x2 / 2;
                    cout << ans << endl;
            }
    
    }
    View Code

    B

    #include <bits/stdc++.h>
    #define PI acos(-1.0)
    #define mem(a,b) memset((a),b,sizeof(a))
    #define TS printf("!!!
    ")
    #define pb push_back
    #define inf 1e9
    //std::ios::sync_with_stdio(false);
    using namespace std;
    //priority_queue<int,vector<int>,greater<int>> que; get min
    const double eps = 1.0e-10;
    const double EPS = 1.0e-4;
    typedef pair<int, int> pairint;
    typedef long long ll;
    typedef unsigned long long ull;
    //const int maxn = 3e5 + 10;
    const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}};
    //priority_queue<int, vector<int>, less<int>> que;
    //next_permutation
    ll Mod = 1000000007;
    int main()
    {
            int n;
            cin >> n;
            int a, b;
            cin >> a >> b;
            if (a > b)
            {
                    swap(a, b);
            }
            if (a <= n / 2 && b > n / 2)
            {
                    cout << "Final!" << endl;
                    return 0;
            }
            int anser = 1;
            while (true)
            {
                    a = (a + (a % 2)) / 2;
                    b = (b + (b % 2)) / 2;
                    if (a == b)
                    {
                            cout << anser << endl;
                            return 0;
                    }
                    anser++;
            }
            return 0;
    }
    View Code

    C

    #include <bits/stdc++.h>
    #define PI acos(-1.0)
    #define mem(a,b) memset((a),b,sizeof(a))
    #define TS printf("!!!
    ")
    #define pb push_back
    #define inf 1e9
    //std::ios::sync_with_stdio(false);
    using namespace std;
    //priority_queue<int,vector<int>,greater<int>> que; get min
    const double eps = 1.0e-10;
    const double EPS = 1.0e-4;
    typedef pair<int, int> pairint;
    typedef long long ll;
    typedef unsigned long long ull;
    //const int maxn = 3e5 + 10;
    const int  maxm = 300;
    const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}};
    //priority_queue<int, vector<int>, less<int>> que;
    //next_permutation
    ll mod = 3e7;
    const int maxn = 200005;
    int num[100005];
    int anser;
    int main()
    {
        int mx=-100005;
        int mn=100005;
        int mxnum=0;
        int mnnum=0;
        int n;
        cin >> n;
        anser=n;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&num[i]);
            mx=max(mx,num[i]);
            mn=min(mn,num[i]);
        }
        if(mx-mn<=1)
        {
            cout<<n<<endl;
            for(int i=1; i<=n; i++)
                cout<<num[i]<<" ";
                cout<<endl;
            return 0;
        }
        for(int i=1; i<=n; i++)
        {
            if(num[i]==mx)
                mxnum++;
            else if(num[i]==mn)
                mnnum++;
        }
        int midnum=n-mxnum-mnnum;
        if(midnum/2>=min(mxnum,mnnum))
        {
            int cur=midnum/2;
            int cur1=cur;
            for(int i=1; i<=n; i++)
            {
                if(num[i]==mn+1&&cur)
                {
                    anser--;
                    num[i]--;
                    cur--;
                    continue;
                }
                if(num[i]==mn+1&&cur1)
                {
                    anser--;
                    num[i]++;
                    cur1--;
                    continue;
                }
            }
        }
        else
        {
            int cur=min(mxnum,mnnum);
            int cur1=cur;
            for(int i=1;i<=n;i++)
            {
              if(num[i]==mn&&cur)
              {
                  num[i]++;
                  anser--;
                  cur--;
                  continue;
              }
              if(num[i]==mx&&cur1)
              {
                  num[i]--;
                  anser--;
                  cur1--;
                  continue;
              }
            }
        }
        cout<<anser<<endl;
        for(int i=1;i<=n;i++)
            cout<<num[i]<<" ";
        cout<<endl;
    
    }
    View Code

    D

    思维题 一层一层地消

    #include <bits/stdc++.h>
    #define PI acos(-1.0)
    #define mem(a,b) memset((a),b,sizeof(a))
    #define TS printf("!!!
    ")
    #define pb push_back
    #define inf 1e9
    //std::ios::sync_with_stdio(false);
    using namespace std;
    //priority_queue<int,vector<int>,greater<int>> que; get min
    const double eps = 1.0e-10;
    const double EPS = 1.0e-4;
    typedef pair<int, int> pairint;
    typedef long long ll;
    typedef unsigned long long ull;
    //const int maxn = 3e5 + 10;
    const int  maxm = 300;
    const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}};
    //priority_queue<int, vector<int>, less<int>> que;
    //next_permutation
    ll mod = 3e7;
    const int maxn = 200005;
    int nextt[100005];
    int num[100005];
    int level[100005];
    int dp[100005];
    int anser = 0;
    int main()
    {
            int n;
            cin >> n;
            dp[1] = level[1] = dp[1] = 1;
            for (int i = 2; i <= n; i++)
            {
                    scanf("%d", &nextt[i]);
                    dp[i] = dp[nextt[i]] + 1;
                    level[dp[i]]++;
            }
            for(int i=1;i<=100000;i++)
            {
                    if(level[i]&1)
                    anser++;
            }
            cout<<anser<<endl;
            return 0;
    }
    View Code

    E

    状压DP

    dp[i][j][k]表示第一个字母是i第二个字母是j距离为k有多少个

    因为第一个字母是由第一个玩家定的 所以无法选择 第二个字母可以选择但只能最优地选一次 所以ans+=now 取所有长度里面概率最高的

    #include <bits/stdc++.h>
    #define PI acos(-1.0)
    #define mem(a,b) memset((a),b,sizeof(a))
    #define TS printf("!!!
    ")
    #define pb push_back
    #define inf 1e9
    //std::ios::sync_with_stdio(false);
    using namespace std;
    //priority_queue<int,vector<int>,greater<int>> que; get min
    const double eps = 1.0e-10;
    typedef pair<int, int> pairint;
    typedef long long ll;
    typedef unsigned long long ull;
    //const int maxn = 3e5 + 10;
    const int  maxn = 100005;
    const int turn[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}};
    const int turn2[8][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}, {1, -1}, { -1, -1}, {1, 1}, { -1, 1}};
    //priority_queue<int, vector<int>, less<int>> que;
    //next_permutation
    char a[10005];
    int dp[30][30][5005];
    int anser = 0;
    int main()
    {
            scanf("%s", a + 1);
            int len = strlen(a + 1);
            for (int i = 1; i <= len; i++)
            {
                    a[i + len] = a[i];
            }
            for (int i = 1; i <= len; i++)
            {
                    for (int j = i + 1; j < i + len; j++)
                    {
                            dp[a[i] - 'a'][a[j] - 'a'][j - i + 1]++;
                    }
            }
            int now = 0;
            int cur;
            for (int i = 0; i < 26; i++)
            {
                    now = 0;
                    for (int j = 2; j <= len; j++)
                    {
                            cur = 0;
                            for (int k = 0; k < 26; k++)
                            {
                                    if (dp[i][k][j] == 1)
                                    {
                                            cur++;
                                    }
                            }
                            now = max(now, cur);
                    }
                    anser += now;
            }
            printf("%.10f", (double)anser / len);
            return 0;
    }
    View Code

    F

    待补

  • 相关阅读:
    web前端的面试真题
    web前端面试真题! 面试的经历和回答只做参考1
    web前端面试真题! 面试的经历和回答只做参考
    html面试资料
    angluar.js的核心介绍
    解决 Chrome支持小于12px 的文字
    div居中效果出现的问题和解决方法
    li和li之间的bug解决方法
    前端面试题笔试考题和答案
    html5新增的标签和使用的方法
  • 原文地址:https://www.cnblogs.com/Aragaki/p/8661025.html
Copyright © 2011-2022 走看看