1.小苯的數字權值
#include <iostream>
#include <algorithm>
using namespace std;const int max_n = 2000000;
int d[max_n + 1];
int f[max_n + 1];int main() {for(int i =1; i<=max_n;i++){for(int j = i; j<=max_n;j+=i){d[j]++;}}for(int i=1; i<=max_n;i++){f[i] = d[i];}for(int i = 2; i <= max_n; i++){for(int j = 2; j <= max_n / i; j++){int k = i * j;if(f[i] + f[j] > f[k]){f[k] = f[i] + f[j];}}}int T;scanf("%d", &T);while(T--){int x;scanf("%d", &x);printf("%d\n", f[x]);}return 0;}
2.小紅的子序逆序列
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;const int MOD = 1e9 +7;class FenwickTree{
private:vector<int> tree;int size;public:FenwickTree(int n) : size(n), tree(n+1,0){}void update(int idx, int delta) {while(idx <= size){tree[idx] += delta;idx += idx & -idx;}}int query(int idx){int res = 0;while(idx > 0){res += tree[idx];idx -= idx & -idx;}return res;}
};int main(){int n;cin >> n;vector<int> a(n);for(int i=0;i<n;++i){cin >> a[i];}vector<int> temp = a;sort(temp.begin(), temp.end());temp.erase(unique(temp.begin(), temp.end()), temp.end());for(int i = 0; i<n;i++){a[i] = lower_bound(temp.begin(), temp.end(), a[i]) - temp.begin() + 1;}FenwickTree ft(temp.size());long long inv_count = 0;for(int i = n-1; i>=0;--i){inv_count += ft.query(a[i] - 1);ft.update(a[i], 1);}long long power = 1;for(int i =0; i < n-2; ++i){power = (power * 2)%MOD;}long long total = (inv_count % MOD) * (power % MOD) % MOD;cout << total << endl;return 0;
}// 64 位輸出請用 printf("%lld")
3.小美的彩帶
#include <iostream>
#include<bits/stdc++.h>
using namespace std;#define all(x) x.begin(), x.end() //
int n, q ,len, m, blo;char op;
int length;
int lisan[20005];
int a[400005], ans[200005];
int mp[200005], siz;
// 64 位輸出請用 printf("%lld")struct stuct{int l, r, idx;bool operator< (const stuct& x) const{if(l/blo != x.l / blo) return l < x.l;return ( l / blo ) & 1 ? r > x.r : r < x.r;}} b[200005];int get(int v){return lower_bound(lisan +1, lisan +1 +m, v) - lisan;
}int main(){scanf("%d %d", &n, &q);for(int i=1; i<=n;++i){scanf("%d", &a[i]);lisan[i] = a[i];}sort(lisan +1, lisan + 1+ n);m = unique(lisan + 1, lisan + 1 + n) - lisan;--m;blo = sqrt( 2* n) * 1.5;for(int i = 1; i <= n; ++i){a[i] = get(a[i]);a[i+n] = a[i];}scanf("\n");int l = 1, r = 2*n, len = 0;for(int i = 1; i<=q;++i){scanf("%c %d\n", &op, &length);if(length >= n){ans[i] = m;length %= n;if(op =='L'){l += length;if(l>n) {l -= n;}}else{r -= length;if( r<= n) r+=n;}continue;}if(op =='L'){++len;b[len].l = l, b[len].r = l + length -1, b[len].idx = i;l+=length;if(l > n) l -= n;}else{++len;b[len].l = r - length + 1, b[len].r = r, b[len].idx = i;r -= length;if(r <= n) r += n;}}sort(b+1, b+1+len);l = 0, r = 0;for(int i = 1; i <= len; ++i){while( r < b[i].r){++r;if(mp[a[r]]==0) siz++;mp[a[r]]++;}while( r > b[i].r){mp[a[r]]--;if(mp[a[r]]==0)siz--;--r;}while( l < b[i].l){mp[a[l]]--;if(mp[a[l]] == 0) --siz;++l;}while( l > b[i].l){--l;if(mp[a[l]] == 0) ++siz;mp[a[l]]++;}ans[b[i].idx] = siz;}for(int i = 1; i<= q; ++i) printf("%d\n", ans[i]);return 0;
}
4.小美和大富翁
5.數組刪除
#include <iostream>
#include <cstring>
#include <vector>
#include <string>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cmath>
#include <queue>
#include <iomanip>
#include <algorithm>using namespace std;// 64 位輸出請用 printf("%lld")unordered_map<long long, long long> hashMap;long long a[20005];void solve() {hashMap.clear();long long n, k, x;cin >> n >> k >> x;for(long long i = 1; i <= n; i++){cin >> a[i];hashMap[a[i]]++;}long long minMiss = 0;while(true){auto it = hashMap.find(minMiss);if(it == hashMap.end()){break;}minMiss++;}long long result = k * minMiss; for(long long i = 1; i <= n; i++){long long start =0;long long mex = -1;auto target = hashMap.find(a[i]);if(target -> second >= 2){hashMap[a[i]]--;}else{hashMap.erase(a[i]);}while(true){auto it = hashMap.find(start);if(it == hashMap.end()){mex = start;break;}start++;}result = min(result, i*x+k*mex);}cout << result << endl;
}int main() {std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);long long T = 1;cin >> T;while(T--){solve();}return 0;
}
6.數字刪除
#include <string>
#include <iostream>
using namespace std;bool isValid(const string & s){if(s.empty() || s == "0") return false;int sum =0;for(char c:s) sum += c - '0';return sum % 3==0;
}int maxDelete(string s){int cnt =0;while(s.length() > 1){bool found = false;for(int i = 0; i< s.length(); i++){string t = s.substr(0,i) + s.substr(i+1);if(isValid(t)){s = t;cnt++;found = true;break;}}if(!found) break;}return cnt;
}int main(){int T;cin >> T;while(T--){string s;cin >> s;cout << maxDelete(s) << endl;}return 0;
}
// 64 位輸出請用 printf("%lld")
7.小紅的數字串
#include <iostream> // 引入輸入輸出流頭文件
#include <string> // 引入字符串處理頭文件
using namespace std;int main() {string s; // 存儲輸入的數字串long long k; // 存儲輸入的正整數kcin >> s >> k; // 讀取輸入int n = s.size(); // 獲取數字串長度long long ans = 0; // 記錄滿足條件的子串數量int left = 0; // 預留變量,實際未使用long long num = 0; // 用于存儲當前子串轉換成的數字// 枚舉每個子串的右端點for (int right = 0; right < n; ++right) {num = 0; // 每次外層循環重置num// 枚舉以right為結尾的所有子串,長度最多為10(因為k最大為1e9,超過10位一定不小于k)for (int l = right; l >= 0 && right - l + 1 <= 10; --l) {num = stoll(s.substr(l, right - l + 1)); // 將子串轉換為數字if (num < k) ans++; // 如果小于k,計數加一else break; // 如果不小于k,提前結束內層循環}}cout << ans << endl; // 輸出滿足條件的子串數量return 0; // 程序結束
}
8.小紅的0 1串
/*
每遇到一個"010"或"101"子串,只需修改其中任意一個字符即可消除該子串。
為避免重疊,每次修改后跳過這3個字符。
時間復雜度O(n)。
*/
#include <iostream> // 引入輸入輸出流頭文件
#include <string> // 引入字符串處理頭文件
using namespace std;// 功能:將01串變為不含"010"和"101"子串的“好串”,返回最小操作次數
int main() {string s; // 定義字符串s,存儲輸入的01串cin >> s; // 讀取輸入的01串int n = s.size(); // 獲取字符串長度int ans = 0; // 記錄最小操作次數// 遍歷字符串,檢查每個長度為3的子串for (int i = 0; i <= n - 3; ) {// 如果當前位置出現"010"或"101"子串if ((s[i] == '0' && s[i + 1] == '1' && s[i + 2] == '0') ||(s[i] == '1' && s[i + 1] == '0' && s[i + 2] == '1')) {ans++; // 需要進行一次操作(取反其中任意一個字符即可消除該子串)i += 3; // 跳過這3個字符,防止重疊子串被重復計數} else {i++; // 如果不是"010"或"101",則繼續檢查下一個位置}}cout << ans << endl; // 輸出最小操作次數return 0; // 程序結束
}
9. 小紅的爆炸串2
/**
代碼解釋1.??初始化??:讀入字符串長度 n、閾值 k 和字符串 s。2.??滑動窗口??:??右指針 j??:遍歷字符串的每個位置。??更新相鄰對數??:若 s[j?1] 和 s[j] 不同,則 cur_sum 加 1。??調整左指針??:當 cur_sum >= k 時,向右移動左指針 i,并減少離開窗口的字符對的貢獻。?3.?計數??:對每個 j,滿足條件的子串數量為 j?i+1,累加到答案 ans。?4.?輸出結果??:打印所有不會爆炸的子串總數。*/#include <iostream> // 引入輸入輸出流頭文件
#include <string> // 引入字符串處理頭文件
using namespace std;int main() {ios::sync_with_stdio(false); // 關閉C++和C的流同步,加快輸入輸出速度cin.tie(0); // 解除cin和cout的綁定,加快輸入輸出int n, k; // n為字符串長度,k為爆炸的最小相鄰不同對數string s; // 存儲輸入字符串cin >> n >> k; // 讀取n和kcin >> s; // 讀取字符串long long ans = 0; // 記錄不會爆炸的子串數量int i = 0; // 滑動窗口左端指針int cur_sum = 0; // 當前窗口內相鄰不同對數// 枚舉右端點j,滑動窗口for (int j = 0; j < n; j++) {if (j >= 1) { // 不是第一個字符時if (s[j-1] != s[j]) {cur_sum++; // 如果當前字符和前一個字符不同,cur_sum加一}}// 如果窗口內不同對數達到k,移動左指針i縮小窗口while (i < j && cur_sum >= k) {if (s[i] != s[i+1]) {cur_sum--; // 移動i時,如果i和i+1不同,cur_sum減一}i++; // 左指針右移}ans += (j - i + 1); // 以j結尾的不爆炸子串數量累加到ans}cout << ans << endl; // 輸出不會爆炸的子串數量return 0; // 程序結束
}
10. 小紅的拼圖
#include <iostream> // 引入輸入輸出流頭文件
#include <vector> // 引入vector容器頭文件
using namespace std;int main() {int t; // t為測試用例組數cin >> t;while (t--) { // 處理每組測試用例int n, m; // n為行數,m為列數cin >> n >> m;vector<string> grid(n); // 存儲拼圖網格for (int i = 0; i < n; i++) {cin >> grid[i]; // 讀取每一行}bool found = false; // 標記是否存在合法拼接方案// 枚舉W形狀的四條邊(上右下左)是凸(1)還是凹(0)for (int t0 = 0; t0 <= 1; t0++) {for (int r0 = 0; r0 <= 1; r0++) {for (int b0 = 0; b0 <= 1; b0++) {for (int l0 = 0; l0 <= 1; l0++) {// edges[i][j][k]表示(i,j)格子第k條邊(0上1右2下3左)是凸(1)還是凹(0)vector<vector<vector<int>>> edges(n, vector<vector<int>>(m, vector<int>(4, -1)));bool valid = true; // 標記當前枚舉的邊形態是否有效// 根據每個格子的旋轉形態,確定其四條邊的凸凹情況for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == '*') continue; // 空格子跳過char c = grid[i][j];if (c == 'W') {edges[i][j] = {t0, r0, b0, l0}; // W: 上右下左} else if (c == 'D') {edges[i][j] = {l0, t0, r0, b0}; // D: 旋轉90度} else if (c == 'S') {edges[i][j] = {b0, l0, t0, r0}; // S: 旋轉180度} else if (c == 'A') {edges[i][j] = {r0, b0, l0, t0}; // A: 旋轉270度}}}// 檢查所有相鄰格子的邊是否契合for (int i = 0; i < n && valid; i++) {for (int j = 0; j < m && valid; j++) {if (grid[i][j] == '*') continue; // 空格子跳過// 檢查右鄰格子if (j + 1 < m && grid[i][j + 1] != '*') {// 當前格右邊和右鄰格左邊之和必須為1(一個凸一個凹)if (edges[i][j][1] + edges[i][j + 1][3] != 1) {valid = false;}}// 檢查下鄰格子if (i + 1 < n && grid[i + 1][j] != '*') {// 當前格下邊和下鄰格上邊之和必須為1if (edges[i][j][2] + edges[i + 1][j][0] != 1) {valid = false;}}}}// 如果當前枚舉的邊形態有效,說明存在合法拼接方案if (valid) {found = true;goto next; // 跳出所有循環,進入輸出}}}}}next:if (found) {cout << "Yes" << endl; // 存在合法方案} else {cout << "No" << endl; // 不存在合法方案}}return 0;
}
11.小紅的奇偶抽取
/**
該程序將輸入的正整數的每一位數字,按奇偶性分別拼接成兩個新數,然后輸出這兩個數的差的絕對值。
例如輸入302938,奇數拼接為393,偶數拼接為28,輸出|393-28|=365。
*/
#include <iostream> // 引入輸入輸出流頭文件
#include <string> // 引入字符串處理頭文件
using namespace std;int main() {string s; // 定義字符串s,用于存儲輸入的數字cin >> s; // 讀取輸入的數字串long long odd_num = 0; // 用于存儲奇數位拼接成的數long long even_num = 0; // 用于存儲偶數位拼接成的數// 遍歷輸入字符串的每個字符for (char c : s) {int digit = c - '0'; // 將字符轉換為對應的數字if (digit % 2 == 1) { // 如果是奇數odd_num = odd_num * 10 + digit; // 拼接到奇數數值后面} else { // 如果是偶數even_num = even_num * 10 + digit; // 拼接到偶數數值后面}}long long diff = odd_num - even_num; // 計算奇數數和偶數數的差if (diff < 0) { // 如果差為負數diff = -diff; // 取絕對值}cout << diff << endl; // 輸出最終結果return 0; // 程序結束
}