#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
来实现,确保每次跳跃都在有效的堆位置之间循环。
- 跳跃过程通过
-
循环检测:
- 每次跳跃后,检查当前堆的石子数量。如果比当前记录的最小值还小,更新最小值并记录该堆的位置。
-
退出条件:
- 当跳回到起始位置时,表示所有堆都已被遍历一遍。