ロスXinshoucun訓練の谷 - 問題解決「BOSS戦2つの入門演習」

P1426の魚の危険も

リンクタイトル:https://www.luogu.com.cn/problem/P1426
タイトル効果:
右側走行にAから線に沿った魚は、第1、第2、魚は、第二から7メートル秒を泳ぐことができたら、 1秒の開始前に、第二の走行距離のわずか98%。極めて邪悪ハンター隠し、検出器の設置は、右S mにおける距離Aであり、Xメートルの範囲の周りの検出器が検出することです。魚は、検出器の範囲に入ると、検出器はハンターに、この第2転送信号の最後になりますが、ハンターは、さらに魚の場合、1秒後の水の範囲の逮捕のために調べる必要があります危険な上、この範囲内。つまり、検出範囲に魚一度、検出器の1秒のすぐ隣の水泳の時間範囲は、安全である場合。今データとXの与えられた、あなたは魚が危険なことはありません伝えることができますしてください?出力危険「y」は、「n」の出力の危険性がない場合。
ソリューションの概要:
サイクルが変位されるまで離れる(\ GE \)\、Sxを1秒、次いで移動し、かどうかを判断する(\ \ GT \) S + X缶。
次のようにコードは次のとおりです。

#include <bits/stdc++.h>
using namespace std;
double S, s, x, v = 7;
bool check() {
    while (s < S-x) {
        s += v;
        v *= 0.98;
    }
    s += v;
    return s > S+x;
}
int main() {
    cin >> S >> x;
    puts( check() ? "n" : "y" );
    return 0;
}

P1464機能

トピックリンク:https://www.luogu.com.cn/problem/P1464
効果の対象:
再帰関数を探しています。
アイデアを問題解決:
多くの重複サブ問題があるメモ(メモリ検索)を使用する必要があります。
次のようにコードは次のとおりです。

#include <bits/stdc++.h>
using namespace std;
bool vis[22][22][22];
long long f[22][22][22];
long long w(long long a, long long b, long long c) {
    if (a <= 0 || b <= 0 || c <= 0) return 1LL;
    if (a > 20 || b > 20 || c > 20) return w(20, 20, 20);
    if (vis[a][b][c]) return f[a][b][c];
    vis[a][b][c] = true;
    if (a < b && b < c) f[a][b][c] = w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c);
    else f[a][b][c] = w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1);
    return f[a][b][c];
}
int main() {
    long long a, b, c;
    while (~scanf("%lld%lld%lld", &a, &b, &c) && !(a==-1 && b==-1 && c==-1)) {
        printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, w(a, b, c));
    }
    return 0;
}

P1014カントールテーブル

トピックリンク:https://www.luogu.com.cn/problem/P1014
効果の対象:
アイテムNキャンターテーブルを検索します。
問題解決のアイデア:
列挙検索。
法律を観光
する分子の私たちの現在のセットです\(A \) 分母がある(\ b)の\、次のようになります。

  • もし\(+ bは\)でもあります。
    • もし\(A \ LT 1 \) 次いで\(A = A-1、 B = B + 1 \)
    • そうでない場合、\(B = B + 1 \)
  • もし\(+ bは\)奇数次のとおりです。
    • もし(B \ 1つのLT \)\、次に\(A = A + 1、 B = B-1 \)
    • 否则,\(a=a+1\)

開始\(A = B = 1 \) この法律サイクル従う\(N-1 \)回。

次のようにコードは次のとおりです。

#include <bits/stdc++.h>
using namespace std;
int n, a = 1, b = 1;
int main() {
    cin >> n;
    while (-- n) {
        if ( (a+b) % 2 == 0 ) {
            if (a > 1) a --, b ++;
            else b ++;
        }
        else {
            if (b > 1) a ++, b --;
            else a ++;
        }
    }
    cout << a << "/" << b << endl;
    return 0;
}

P1022電卓改善

トピックリンク:https://www.luogu.com.cn/problem/P1022
効果の対象:線形方程式を解きます。
ソリューションの概要:
この質問は、複数の入力を処理するために複雑になります。
私は、文字列「シンボル」の複数の形に処理+「番号」+「/ B」、その正規化された文字列形式の後、私は使用にstringstreamを処理するように開始しました。
その後、詳細の一部を扱う小さな神経ラッキング、脳細胞が狂ったものをたくさん死んで、対処しなければなりません。
次のようにコードは次のとおりです。

#include <bits/stdc++.h>
using namespace std;
string s;
char cc;
int main() {
    cin >> s;
    bool flag = false;

    for (int i = 0; i < s.length(); i ++) {
        if (isalpha(s[i])) {
            cc = s[i];
            s[i] = 'a';
        }
        if (s[i] == '=') { flag = true; }
        else if (flag && s[i] == '+') s[i] = '-';
        else if (flag && s[i] == '-') s[i] = '+';
    }
    for (int i = 0; i < s.length(); i ++) {
        if (s[i] == '=') {
            if (s[i+1] != '+' && s[i+1] != '-') s[i] = '-';
            else s = s.substr(0, i) + s.substr(i+1);
            break;
        }
    }
    if (s[0] == 'a') s = "1" + s;
    while (true) {
        int idx = -1;
        int len = s.length();
        for (int i = 1; i < len; i ++) {
            if (s[i] == 'a' && !isdigit(s[i-1])) {
                idx = i;
                break;
            }
        }
        if (idx == -1) break;
        else s = s.substr(0, idx) + "1" + s.substr(idx);
    }
    while (true) {
        int idx = -1;
        int len = s.length();
        for (int i = 0; i < len; i ++) {
            if (isdigit(s[i]) && (i==len-1 || s[i+1]=='+' || s[i+1]=='-' )) {
                idx = i;
                break;
            }
        }
        if (idx == -1) break;
        else s = s.substr(0, idx+1) + "b" + s.substr(idx+1);
    }
    stringstream ss(s);
    char c;
    int num, a = 0, b = 0;
    while (ss >> num >> c) {
        if (c == 'a') a += num;
        else b += num;
    }
    double res = - (double) b / (double) a;
    printf("%c=%.3lf\n", cc, res);
}

P1307の桁反転

トピックリンク:https://www.luogu.com.cn/problem/P1307
効果の対象:署名されたデジタルフリップ。
問題解決のアイデア:最初のシンボルを削除してから、データを反転し、最終的にスタートは、プラス記号負の場合。
次のようにコードは次のとおりです。

#include <bits/stdc++.h>
using namespace std;
bool flag = false;
int a, b;
int main() {
    cin >> a;
    if (a < 0) { flag = true; a = -a; }
    while (a) {
        b = b * 10 + a % 10;
        a /= 10;
    }
    if (flag) b *= -1;
    cout << b << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/quanjun/p/11954123.html