[ゲーム]アルゴリズムコードプログラミングコンテスト - ブルーブリッジカップシミュレーションゲーム3

ゲーム:

http://oj.hzjingma.com/contest/view?id=69


 

質問A:あるかないように、これは問題(文字列トラバーサル)であります

質問B:リトル狙撃兵開始98K(数学:確率論)

質問C:ダン蓮のクアン、甲は、骨太(または数学的な暴力の列挙の組み合わせ)

質問D:水のChoudao流れ、トースト心配心配心配ピン(バイナリ列挙)

質問E:ラウンド、そして世界のために左手右手側は、ソウル(数学)を警告することができ

質問F:算術幾何公差は、共通比必要な項目(思考速い+アナログ+パワー)を介して連結されています

質問G:(貪欲)汚れスローとして全体の後退損益、名声と富を見抜きます

質問H:宝のコンセプトエビを分離するよう、万円以上の反射光(BFS、BFSを使用することが知られているアイデアを、理解)

質問I:無力拒否され、奇跡を知ることが発生する可能性がありますか(しません)

質問J:世界の終わり、私はあなたの手を取るよ(ありません)

 


質問A:あるかないように、これは問題(文字列トラバーサル)であります

 

プログラミング、読書などトラバーサルの使用は、文字の数をカウントします。手紙の最後に、最大出力数

#include<bits/stdc++.h>
using namespace std;

int cnt[30], A[30];

int main()
{
    memset(cnt, 0, sizeof(cnt));
    memset(A, 0, sizeof(A));

    string s;
    vector<string> passages;
    freopen("input.txt", "r", stdin);
    while(cin >> s)
    {
        passages.push_back(s);
    }

    for(auto p : passages)
    {

        for(int i = 0;i < p.size(); ++i)
        {
            // 不区分大小写
            if(p[i] >= 'a' && p[i] <= 'z') ++cnt[p[i] - 'a'];
            if(p[i] >= 'A' && p[i] <= 'Z') ++cnt[p[i] - 'A'];
        }
        cout << endl;
    }
    
    int res = 0;
    for(int i = 0;i < 26; ++i)
    {
        res = max(res, cnt[i]);
    }
    cout << res << endl;


    return 0;
}

 


質問B:リトル狙撃兵開始98K(数学:確率論)

 

所望の式:E = \合計P_I * V_Iここで、Vは、ショット数で、Pは確率がに対応されています

最初のショットでは、V = 1は、その後、確率は0.75である場合

*(0.75 * 0.9)= - 2 Vは、最初のショットでは、第二のガンは、その後確率は(0.75 L)ではない場合

*(1 - 0.9 * 0.75)*(0.75 * 0.9 * 0.9) - V = 3は、第一及び第二のガンは、次いで、確率(0.75リットル)第ガンでないとき

<0.5これまでのヒット確率まで。

だから、レコードが(いない最後の確率で、常に疲れにある)変数の記録その変数の確率ではありません前に変数のレコードが何度も、何度か撮影しているプログラム、インチ (期待は、それぞれ蓄積の確率*の数を含むことです)

 

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int cnt = 1;  // 第几次射击
    double res = 0;
    double get = 0.75;  // 这次中的概率
    double p = 1;  // 前几次都不中概率
    while(get >= 0.5)
    {
        res += p * get * cnt;  // 第几次射击时的期望累加

        ++cnt;     // 射击次数增加
        p *= (1.0 - get);   // 相当于上一次不中,也就是累乘不中概率
        get *= 0.9;   // 这次中的概率

    }

    printf("%0.6lf\n", res);
    return 0;
}

 


質問C:ダン蓮のクアン、甲は、骨太(または数学的な暴力の列挙の組み合わせ)

 

考え、組合せ論

すなわち、時間が挿入し、5,4,3,3であり、全体として有名な4つのための全体、次いで残りならびに16日(16空の17日間)としてそれぞれ必要とされます合計があるかもしれないとき:17 * 18 * 19 * 20 = 116280。(17最初に挿入し、空にしてから挿入し、18空; 19、空、挿入; 20、空、最後のインサートA)

 

2、暴力列挙を考えます

私たちは、それぞれの時間を読み始めるの傑作を列挙し、それは完全な要件を満たしていない、とすることができるプログラムを決定します。つまり、この有名な日の各読み取りは、他を読み取ることができません。

私たちは、VIS変数を使用して読んwhether'veあなたが読んだことがあれば、毎日記録することができ、我々は、このプログラムは可能ではない、読んで。

 

#include<bits/stdc++.h>
using namespace std;

bool isCan(int a, int b, int c, int d)
{
    int vis[40];
    memset(vis, 0, sizeof(vis));  // 记录 31 天的读书情况

    for(int i = 0; i < 5; ++i) vis[a + i] = 1;  // 第一本名著 5 天
    for(int i = 0;i < 4; ++i)  // 第二本 4 天
    {
        if(vis[b + i] == 1) return false;   // 如果这天已经读了,那么就不能再读了
        vis[b + i] = 1;
    }
    for(int i = 0;i < 3; ++i)
    {
        if(vis[c + i] == 1) return false;
        vis[c + i] = 1;
    }
    for(int i = 0;i < 3; ++i)
    {
        if(vis[d + i] == 1) return false;
        vis[d + i] = 1;
    }
    return true;
}

int main()
{
    int cnt = 0;
    
    for(int a = 1; a <= 27; ++a)  // 5
    {
        for(int b = 1; b <= 28; ++b)  // 4
        {
            for(int c = 1; c <= 29; ++c)  // 3
            {
                for(int d = 1;d <= 29; ++d)   // 3
                {
                    if(isCan(a, b, c, d)) ++cnt;
                }
            }
        }
    }

    cout << cnt << endl;
    return 0;
}

 


質問D:水のChoudao流れ、トースト心配心配心配ピン(バイナリ列挙)

 

新しい番号を形成するために一緒に22の総数は、0~12の前記選択された数、。

私たちは、唯一の2例は、それは、0または1であり、取る取るか22番、あらゆる数のため、バイナリ列挙体を使用することができます。したがって、2 ^ 22の合計は、4E6にほぼ等しいです。それはタイムアウトしません。

我々はバイナリを列挙するので、各ビットは、この番号に対応するか、取らないように、撮影した場合は、疲れているとします。また、我々はそれがこのスキームが成り立たないことを、> 12であれば、数1から、この借入を判断する必要がありますので、最後は唯一、12を取ることに注意してください。

次いで、すべての場合の数を算出し、集合統計情報(複製、デエンファシスが存在してもよいです)。

- (その大部分を構成してもよい)で数セットの合計(1695):最後に、答えは答えはあるので、番号を構成することができない、依頼することです

 

#include<bits/stdc++.h>
using namespace std;

int nums[22] = {3,5,7,11,13,19,23,29,31,37,41,53,59,61,67,71,97,101,127,197,211,431};

set<int> recd;

int main()
{
    recd.clear();
    int lim = (1 << 22);

    for(int i = 0;i < lim; ++i)
    {
        int cnt = 0;
        int res = 0;
        int tep = i;
        for(int j = 0;j < 22; ++j)
        {
            if((tep >> j) & 1)
            {
                ++cnt;
                res += nums[j];
            } 
        }
        if(cnt <= 12) 
        {
            recd.insert(res);
        }
    }
    int cnt = 1695;
    cout << cnt - recd.size() << endl;

    return 0;
}

質問E:ラウンド、そして世界のために左手右手側は、ソウル(数学)を警告することができ

、算出された値である主題によると、私たちは、描画することでそれを見ることができます

すなわち、4回、三角形の面積の4倍のセクタ領域。

三角形、二つの側面、ピタゴラスの定理を求めて下、及びS = 1/2 * *高底の良いエリアを探しています

セクタ領域の場合:  \ FRAC {1} {2} \シータR ^ 2θはラジアン単位の角度であり、我々はAの後に与えるため、ラジアン三角形(= 4/3 COSA)でその角度を見つけることができ、発明者らは、A + A +θ= PI / 2。次に、θを見つけることができます。

残りは、コードの値を求めることです

#include<bits/stdc++.h>
using namespace std;

const double PI = 3.14159265358979;

int main()
{
    double res = 3.0 * sqrt(7.0) + 8.0 * (PI / 2.0 - 2.0 * acos(3.0 / 4.0));

    printf("%0.2lf\n", res);
    return 0;
}

 


質問F:算術幾何公差は、共通比必要な項目(思考速い+アナログ+パワー)を介して連結されています

私たちは、V1 = B /、V2 = C / B。最大のために、それは可能な限り大きく公比qのうち必要

これは、V1、V2が、および= V2を= V1を満たすことができるQの最大の力の一つ見つけるためにする必要があります。

いくつかの特別な例:

1)B = A、B、またはC =時間、公比をq = 1の場合

2)V1 == v2の場合、それは直接、Q = V1とすることができます。

残りのケースでは、我々はすでにそれをq = v1のではないでしょうので、その後、最も可能性が高い(処方から見て開始する必要があり、一般的な比率ではありません(最小v1とv2はv1の中に保存されている)V1を知っているということです、その後、できるだけ大きくQを作るために、その後、Q ^ 2 = V 1、Q = SQRT(V1)、2まで、列挙Q)

それは、Q及びV1は、V2は、例えば、電源関係(あると判断され、Q ^ X = V1、V1の%のQ == 0、アップV1 == 1まで、またはQに満足されていないと言うことです^ X = V1)

最終的な結果の等比数列のQ後、その項目Nは、式に従って、= A1 * Q ^( - 1 N)です。

データがnの範囲以来、私たちは、解決するには、高速の電力を使用します。

 

#include<bits/stdc++.h>
using namespace std;

#define LL long long

const LL MOD = 1e9;

LL qpow(LL x, LL y)
{
    LL ans = 1;
    while(y)
    {
        if(y & 1) ans = ans * x % MOD;
        x = x * x % MOD;
        y >>= 1;
    }
    return ans;
}

bool isCan(LL x, LL y)  // x == y ^ n
{
    while(x)
    {
        if(x == 1) return true;
        if(x % y != 0) return false;

        x /= y;
    }
}

int main()
{
    LL a, b, c, N;
    cin >> a >> b >> c >> N;

    if(a == b || a == c) cout << a << endl;
    else
    {
        LL res = 0, q = 0;
        LL v1 = b / a, v2 = c / b;

        if(v1 > v2) swap(v1, v2);

        if(v1 == v2) q = v1;
        else
        {
            q = v1;
            int temp = sqrt(v1);

            for(int i = temp + 1; i >= 2; --i)
            {
                if(isCan(v1, i) && isCan(v2, i))
                {
                    q = i;
                    break;
                }
            }
        }

        res = a * qpow(q, N - 1) % MOD;
        cout << res << endl;
    }

    return 0;
}

質問G:(貪欲)汚れスローとして全体の後退損益、名声と富を見抜きます

 

我々は、この時点で余剰品の補充と、最初、残り物の前に数日があるかもしれない、特定の日需要。

補充した場合、さらに悪い、彼らは新しいを購入する必要があります

あなたはリフトを購入することができますので、購入のためとして、私たちはその日を見つけると、すべての最も高価なの前で(これは最小のコストを行い、可能のように、このようので、我々は先に、フロント買いで同等のです)。

だから、購入価格のために、私たちは、この日のために探していると、以前のすべての購入のための最低価格をすることができます。

 

特に注目すべきなのは、ボックスのレモンを買うに起因する、すべての注意を払う= 80 5×16でした。一方、あなたが80で割り切れることができないならば、我々は少しを購入したいという、新しいレモンを購入するが、この方法は、残り物があるでしょう(レコード)

 

#include <bits/stdc++.h>
using namespace std;

#define LL long long

int main()
{
    LL n, a, b;
    cin >> n >> a >> b;
    
    LL miPa = 1000, miPb = 1000;
    LL hasPa = 0, hasPb = 0;

    LL res = 0;

    for(int i = 0;i < n; ++i)
    {
        LL c, pa, pb;
        cin >> c >> pa >> pb;

        miPa = min(miPa, pa);
        miPb = min(miPb, pb);

        res += c * a * miPa;

        if(hasPb >= c * b)  // 剩货超过需要的,那么不需要重新买
        {
            hasPb -= c * b;
        }
        else  // 否则,说明不够,要重新买
        {
            LL needPb = c * b - hasPb;
            hasPb = 0;

            if(needPb % 80 == 0)
            {
                res += (needPb / 80) * miPb;
                
            }
            else
            {
                LL tep = (needPb / 80) + 1;   // 不被整除,说明多买一盒
                res += tep * miPb;
                hasPb = tep * 80 - needPb;   // 多出来的剩货,要记录
            }
        }

    }
    cout << res << endl;

    return 0;
}

質問H:宝のコンセプトエビを分離するよう、万円以上の反射光(BFS、BFSを使用することが知られているアイデアを、理解)

 

この質問は、BFSと知ることですが、思考の方法の種類がわかりません。

私は理解していないので、コードは他の人から提出されたリンクを見ることができますが、アイデアは知りませんでした。

 


質問I:無力拒否され、奇跡を知ることが発生する可能性がありますか(しません)

 

私は理解していないので、コードは他の人から提出されたリンクを見ることができますが、アイデアは知りませんでした。


質問J:世界の終わり、私はあなたの手を取るよ(ありません)

 

私は理解していないので、コードは他の人から提出されたリンクを見ることができますが、アイデアは知りませんでした。

公開された136元の記事 ウォンの賞賛126 ビュー110 000 +

おすすめ

転載: blog.csdn.net/Mikchy/article/details/104581598