826 フライの筆記試験

最初の質問

Xiaohong は、正の整数 x を次の 2 つの条件を満たす完全偶数として定義します。

  1. x は偶数です
  2. x は l 以上、r 以下です。Xiaohong
    は長さ m の配列 a を取得しました。彼女は、この邪悪な配列に完全偶数がいくつあるか知りたいと考えています。

入力の説明
最初の行は、3 つの正の整数 n、l、r を入力します。 2 行目は、Xiaohong が取得した配列1 ≤ n, a_i ≤ 100 1 ≤ l ≤ r ≤ 100を表すn 個の正の整数を入力します
。出力は、完全偶数の配列数



例 1: 5 3 8 1 2 6 8 7
と入力します。

出力
2

#include <iostream>
#include <vector>

int main() {
    
    
    int n, l, r;
    std::cin >> n >> l >> r;
	
	int num;
	int res = 0;
	for(auto i : n){
    
    
		std::cin >> num;
		if ((num % 2 == 0) && (num >= l && num <= r)) {
    
    
            res++;
        }
	}
	
	std::cout << res << std::endl;
  
    return 0;
}

2番目の質問

2 つの文字列間の類似性を求めます。
類似性は次のように定義されます。

  1. 2 つの文字列の長さが同じ、類似度 +1
  2. 同じ文字セットを使用すると、類似度 +1

説明の入力
1 行目に問い合わせ件数を表す正の整数 t を入力します
チームドクターが尋ねるたびに
1 ≤ t ≤ 10 の2 つの文字列を入力します

出力の説明:
t 行の各行に類似性を表す整数を入力します。

3 abcd 1234 abc. S?AD aha a ha
と入力します。






出力
1
2
0

#include <iostream>
#include <unordered_map>
using namespace std;

int calculateSimilarity(string str1, string str2) {
    
    
    int similarity = 0;

    if (str1.length() == str2.length()) {
    
    
        similarity++;
    }

    unordered_map<char,int> charSet1,charSet2;
    charSet1.insert(make_pair('0',0));
    charSet1.insert(make_pair('a',0));
    charSet1.insert(make_pair('o',0));
    charSet2.insert(make_pair('0',0));
    charSet2.insert(make_pair('a',0));
    charSet2.insert(make_pair('o',0));
    for (char c : str1) {
    
    
        if (isdigit(c)) {
    
    
            charSet1['0']++;
        } else if (isalpha(c)) {
    
    
            charSet1['a']++;
        } else {
    
    
            charSet1['o']++;
        }
    }

    for (char c : str2) {
    
    
        if (isdigit(c)) {
    
    
            charSet2['0']++;
        } else if (isalpha(c)) {
    
    
            charSet2['a']++;
        } else {
    
    
            charSet2['o']++;
        }
    }

    if (charSet1['0'] == charSet2['0'] && charSet1['a'] == charSet2['a'] && charSet1['o'] == charSet2['o']) {
    
    
        similarity++;
    }

    return similarity;
}

int main() {
    
    
    int t;
    cin >> t;

    while (t--) {
    
    
        string str1, str2;
        cin >> str1 >> str2;
        
        int similarity = calculateSimilarity(str1, str2);
        cout << similarity << endl;
    }

    return 0;
}

小紅さんは文字列を取得しましたが、その中には「?」になった文字列もありました。Xiaohong は、最後の文字列で表される 10 進整数が p の倍数になるように、すべての「?」を任意の数字文字に置き換えてほしいと考えています。最終的に解がいくつあるかを Xiaohong に教えてください。 注: 先行ゼロを含めることができます。 .
回答ありがとうござい
ます 大きすぎる場合は10^9-+7の法をとってください
説明の入力
1行目に数字と「?」からなる文字列を入力
2行目に正の整数pを入力してください。
文字列の長さは 100 を超えません;
1 ≤p≤10^4出力の
説明— 10^9 +7を法とする
スキームの数の値を表す整数
1
入力
??出力0はそれがどのようなものであっても意味します変更されている場合、それは奇数であり、2 の倍数にすることはできません











主な手順は次のとおりです。

  • 指定された文字列と法 p の解の数を計算する再帰関数を定義します。この関数には 4 つのパラメータがあります: s は文字列を表し、p は法を表し、index は現在走査されている文字の添え字を表し、残りは現在の剰余を表します。 。
  • 文字列を走査した後、余りが 0 かどうかを判断し、そうであれば、これが適格な解であることを意味し、1 を返し、それ以外の場合は 0 を返します。
  • 現在の文字が '?' でない場合は、剰余を直接計算し、次の文字に再帰します。剰余を計算する方法は、現在の剰余に 10 を掛け、現在の文字で表される数値を加算し、その剰余を計算します。 pの
  • 現在の文字が「?」の場合は、考えられるすべての数値を試してスキームの数を累積し、オーバーフローを防ぐために各累積後に MOD の剰余を取得します。同時に、各試行後に剰余の値が次の試行のために復元されます。
  • main関数では、文字列と法pを入力して再帰関数を呼び出し、0番目の文字から余りが0になるスキームの数を計算し、結果を出力します。
#include <iostream>
#include <string>
using namespace std;

// 定义一个常量 MOD 为 10^9 + 7
const int MOD = 1000000007;

// 定义一个递归函数,用来计算给定字符串和模数 p 的方案数
int countWays(string s, int p, int index, int remainder) {
    
    
    // 如果字符串遍历完毕,判断余数是否为 0
    if (index == s.size()) {
    
    
        return remainder == 0 ? 1 : 0;
    }
    // 如果当前字符不是 '?',则直接计算余数并递归下一个字符
    if (s[index] != '?') {
    
    
        remainder = (remainder * 10 + (s[index] - '0')) % p;
        return countWays(s, p, index + 1, remainder);
    }
    // 如果当前字符是 '?',则尝试所有可能的数字字符,并累加方案数
    int ans = 0;
    for (char c = '0'; c <= '9'; c++) {
    
    
        remainder = (remainder * 10 + (c - '0')) % p;
        ans += countWays(s, p, index + 1, remainder);
        ans %= MOD; // 每次累加后取模
        remainder = (remainder - (c - '0') + p) % p; // 恢复余数
    }
    return ans;
}

int main() {
    
    
    // 输入字符串和模数 p
    string s;
    int p;
    cin >> s >> p;
    // 调用递归函数,从第 0 个字符和余数为 0 开始计算方案数
    int ans = countWays(s, p, 0, 0);
    // 输出结果
    cout << ans << endl;
    return 0;
}

バックトラッキング
文字列を逆にたどって、配列 total_ways を維持します。total_ways[i] は、剰余が i の場合の解の数を表します。そして、その文字が「?」であるかどうかに応じて、それぞれ累積剰余を計算し、計略数を更新する。最後に、total_ways[0]、つまり剰余が 0 のスキームの数が返されます。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

const int MOD = 1000000007;

int countModularMultiples(const string& s, int p, int idx, int cur_mod, vector<vector<int>>& dp) {
    
    
    if (idx == s.size()) {
    
    
        return (cur_mod == 0) ? 1 : 0;
    }
    
    if (dp[idx][cur_mod] != -1) {
    
    
        return dp[idx][cur_mod];
    }
    
    int ways = 0;
    
    if (s[idx] != '?') {
    
    
        int digit = s[idx] - '0';
        ways = countModularMultiples(s, p, idx + 1, (cur_mod * 10 + digit) % p, dp);
    } else {
    
    
        for (int digit = 0; digit <= 9; ++digit) {
    
    
            ways = (ways + countModularMultiples(s, p, idx + 1, (cur_mod * 10 + digit) % p, dp)) % MOD;
        }
    }
    
    dp[idx][cur_mod] = ways;
    return ways;
}

int main() {
    
    
    string s;
    int p;
    cin >> s >> p;
    
    vector<vector<int>> dp(s.size(), vector<int>(p, -1));
    
    int result = countModularMultiples(s, p, 0, 0, dp);
    cout << result << endl;
    
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_47895938/article/details/132511739