
 
 
 
 
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;// 定义存储每个队伍的相关数据结构
struct TeamData {int solved_count = 0;                // 通过题目数量int total_penalty = 0;              // 总罚时unordered_map<char, int> attempts;  // 每题的错误尝试次数unordered_set<char> solved;         // 已解决题目集合
};int main() {int n; // 输入的记录条数cin >> n;// 用一个哈希表存储每个队伍的相关数据unordered_map<string, TeamData> teams;// 逐行读取比赛记录for (int i = 0; i < n; ++i) {string team_name; // 队伍名称char problem;     // 题目编号int flag;         // 评测结果:0 表示错误,1 表示通过int time;         // 提交时间cin >> team_name >> problem >> flag >> time;// 获取或初始化队伍的数据TeamData &data = teams[team_name];// 如果该题目已经被正确解答,忽略后续提交if (data.solved.count(problem)) {continue;}if (flag == 1) {// 如果本次提交通过,更新队伍的解题信息data.solved.insert(problem); // 将题目标记为已解决data.solved_count++;         // 解题总数 +1// 总罚时 = 解题用时 + 错误尝试罚时data.total_penalty += time + data.attempts[problem] * 20;} else {// 如果本次提交错误,记录错误尝试次数data.attempts[problem]++;}}// 按规则找出冠军队伍pair<string, TeamData> champion; // champion.first 存队伍名,champion.second 存数据for (const auto &entry : teams) {const string &name = entry.first;   // 当前队伍的名字const TeamData &data = entry.second; // 当前队伍的数据// 判断当前队伍是否比目前记录的冠军更优if (champion.first.empty() || data.solved_count > champion.second.solved_count || // 优先比较解题数(data.solved_count == champion.second.solved_count && data.total_penalty < champion.second.total_penalty)) { // 解题数相同时比较罚时champion = entry; // 更新冠军队伍信息}}// 输出冠军队伍结果cout << champion.first << " " << champion.second.solved_count << " " << champion.second.total_penalty << endl;return 0;
}

 
 
 
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;// 计算 n-r 的所有因子并统计满足条件的因子数量
int count_factors(int n_minus_r, int r) {int count = 0; // 符合条件的因子数量for (int i = 1; i * i <= n_minus_r; ++i) {if (n_minus_r % i == 0) {// 因子 iif (i > r) count++;// 因子 n_minus_r / i    一共两个因子(都要满足大于r的条件)//                                      (且第二个因子不等于第一个)if (i != n_minus_r / i && n_minus_r / i > r) count++;}}return count;
}int main() {int n, q;cin >> n >> q;while (q--) {int k, r;cin >> k >> r;// 计算 n-rint n_minus_r = n - r;// 统计满足条件的因子数量int factors_count = count_factors(n_minus_r, r);// 判断是否满足不少于 k 个因子的条件if (factors_count >= k) {cout << "YES" << endl;} else {cout << "NO" << endl;}}return 0;
}

 
 
#include<bits/stdc++.h>
using namespace std;const int N = 1000010; // 定义 dp 数组最大长度,保证能处理数据范围
const int mod = 1e9 + 7; // 取模常量,用于防止结果溢出int n, m, k, dp[N], a[N], result = 0; // 定义变量
// n: 初始原材料数量,m: 目标原材料数量,k: 掉落种类数
// dp[N]: 动态规划数组,a[k]: 掉落的可能值int main()
{cin >> n >> m >> k; // 输入初始数量、目标数量、掉落种类int t = m - n;      // 计算所需的最小差值(最小需要补充的原材料数)for (int i = 1; i <= k; i++) {cin >> a[i];    // 输入每次打怪可能掉落的原材料数量}dp[0] = 1; // 初始条件:拥有 0 个原材料的方案数为 1for (int i = 0; i < t; i++) { // 枚举当前原材料数量for (int j = 1; j <= k; j++) { // 遍历每种掉落数量dp[i + a[j]] += dp[i];  // 递推公式:将当前方案数转移到新的状态dp[i + a[j]] %= mod;   // 对结果取模}}int ans = 0; // 存储答案for (int i = t; i < 4e5; i++) { // 枚举所有满足 \( i \geq t \) 的状态ans = (ans + dp[i]) % mod;  // 累加方案数并取模}cout << ans; // 输出最终结果return 0;
}

 
 
 
 
#include <bits/stdc++.h>
using namespace std;// 模拟游戏逻辑,找出最终的胜负结果
string playGame(priority_queue<int> &aliceCards, priority_queue<int> &bobCards) {while (!aliceCards.empty() && !bobCards.empty()) {// Alice 出最大牌int aliceTop = aliceCards.top();aliceCards.pop();// Bob 出最大牌int bobTop = bobCards.top();bobCards.pop();if (aliceTop == bobTop) {// 如果点数相等,两张牌都丢弃,进入下一轮continue;} else if (aliceTop > bobTop) {// Alice 的牌更大aliceCards.push(aliceTop - bobTop);} else {// Bob 的牌更大bobCards.push(bobTop - aliceTop);}}// 判断最终结果if (!aliceCards.empty() && bobCards.empty()) {return "Alice"; // Alice 获胜} else if (!bobCards.empty() && aliceCards.empty()) {return "Bob"; // Bob 获胜} else {return "draw"; // 平局}
}int main() {int n, m;cin >> n >> m; // 读取 Alice 和 Bob 的牌数// 使用优先队列(大顶堆)来存储牌priority_queue<int> aliceCards, bobCards;// 读取 Alice 的牌for (int i = 0; i < n; i++) {int card;cin >> card;aliceCards.push(card);}// 读取 Bob 的牌for (int i = 0; i < m; i++) {int card;cin >> card;bobCards.push(card);}// 模拟游戏并输出结果cout << playGame(aliceCards, bobCards) << endl;return 0;
}

 
解决思路:
-  输入和初始化: - 你有 n堆石子,每堆有不同的数量。
- 小明从第 s堆开始,跳跃步数是k。每跳一次,小明会到达一个新的堆并从那里拿走一颗石子。
 
- 你有 
-  跳跃的规律: - 由于石子堆按顺时针排列,并且是环形的,所以小明的跳跃是一个环形遍历。
- 每次跳跃后,小明到达堆的位置是 (当前堆编号 + k) % n,确保跳跃是环形的,不会超出范围。
- 小明每次跳跃后会检查当前堆的石子数量,并选择石子数量最少的堆,直到某堆的石子被完全拿完。
 
-  循环遍历直到找到最小石子堆: - 从起始堆出发,小明每次跳跃到下一堆,直到回到起始堆。每次跳跃时,检查当前堆的石子数量。如果该堆的石子数量小于当前记录的最小值,更新最小值。
- 由于小明是顺时针跳跃,所以会遍历所有堆。确保能够找到石子数量最少的堆。
 
-  退出条件: - 小明每跳跃一次,就从当前堆拿走一颗石子。
- 循环结束时,最先被拿完的堆就是石子最少的堆。
 
-  输出: - 输出最先被拿完的堆的编号。题目要求输出是 1-based 编号,所以需要对找到的最小堆位置加 1。
 
代码的执行流程:
-  读取输入: - 获取 n、k、石子堆的数量数组a,以及起始堆的位置s。
 
- 获取 
-  计算跳跃和最小石子堆: - 根据当前堆的位置进行跳跃,更新最小石子数量的堆。
 
-  输出结果: - 输出最先被拿完的堆编号。
 
关键步骤解释:
-  最初的起始位置: - 输入的起始位置是 1-based,所以在程序中需要减去 1 来转换为 0-based 索引。
 
-  跳跃的过程: - 跳跃过程通过 (当前堆编号 + k) % n来实现,确保每次跳跃都在有效的堆位置之间循环。
 
- 跳跃过程通过 
-  循环检测: - 每次跳跃后,检查当前堆的石子数量。如果比当前记录的最小值还小,更新最小值并记录该堆的位置。
 
-  退出条件: - 当跳回到起始位置时,表示所有堆都已被遍历一遍。