云剪贴板
云剪贴板 bbjdd34j
公开
云剪贴板操作
由 ppip 于 2026/01/29 22:20 创建,当前公开。
- 当前快照
- 1 份
- 快照标识符
- @mlgxt554
- 此快照首次捕获于
- 2026/02/11 02:31 上周
- 此快照最后确认于
- 2026/02/11 02:31 上周
=== 抽奖结果 ===
-
比赛第一名奖励(18元,同分平分): 最高分: 350 获奖者 (1人):
- legendcn666 每人获得: 18.00元
-
随机抽取5个奖励(12.9元):
- masy2011
- ygwlan
- qinhuanmma
- Syzygy_
- hopeful_imitation
-
随机抽取50个奖励(1.29元):1 . bz02 2 . aaron0919
3 . EgorKu 4 . cjZYZtcl
5 . MisserinaAFO 6 . ForgotMe
7 . zxw003 8 . InnocentPrayer
9 . WYX1210 10. AugustKing
11. wtcqwq 12. Antiphilia
13. yyy_empty 14. Polymorph
15. 喵仔牛奶 16. Sou39O
17. Inracle 18. yanqijin
19. min_inf 20. YiZhiMengXin65535
21. Abczzzzz 22. NegetiveEdgeWeight
23. sbno333 24. ABANDON_AC
25. Liuyuzhuo 26. lw393
27. federer014 28. ExFish
29. Associate_Entropy 30. Xiwu_6665
31. rsy_ 32. nauyng
33. Zhr_always 34. ZZFLS_zwr
35. StupidQichenwang 36. katelog
37. sgl15395010271 38. blue_ice26
39. restart_to_revive 40. GavinCQTD
41. lizirui20131212 42. qingyun_123
43. m4xzheng 44. Code_Bug_Free
45. diqiuyi 46. Hcy114514
47. Lay____ 48. zhanghuanwen
49. liuleqi 50. ljb985211
代码公示
CPP#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <map>
#include <set>
#include <random>
#include <algorithm>
#include <iomanip>
using namespace std;
struct Contestant {
string id;
int totalScore;
vector<int> problemScores;
};
// 从CSV文件读取榜单数据
vector<Contestant> parseLeaderboardFromFile(const string& filename) {
vector<Contestant> contestants;
ifstream file(filename);
if (!file.is_open()) {
cerr << "错误:无法打开文件 " << filename << endl;
return contestants;
}
string line;
bool isFirstLine = true;
while (getline(file, line)) {
// 跳过空行
if (line.empty()) continue;
if (isFirstLine) {
isFirstLine = false;
continue; // 跳过标题行
}
stringstream ss(line);
Contestant c;
string token;
// 读取ID
getline(ss, token, ',');
c.id = token;
// 读取总分
getline(ss, token, ',');
c.totalScore = token.empty() ? 0 : stoi(token);
// 读取各题分数
c.problemScores.clear();
while (getline(ss, token, ',')) {
// 处理空值和非数字值
if (token.empty() || !isdigit(token[0])) {
c.problemScores.push_back(0);
} else {
try {
c.problemScores.push_back(stoi(token));
} catch (...) {
c.problemScores.push_back(0);
}
}
}
contestants.push_back(c);
}
file.close();
return contestants;
}
// 计算一血RID之和(使用提供的5个RID)
long long calculateFirstBloodSum() {
// 题目顺序:T723555, T724554, T724556, T724553, T724664
// 提供的RID: 259614130, 259608913, 259612115, 259634810, 0
vector<long long> firstBloodRIDs = {259614130, 259608913, 259612115, 259634810, 0};
long long sum = 0;
for (long long rid : firstBloodRIDs) {
sum += rid;
}
return sum;
}
// 进行抽奖
vector<string> drawPrizes(const vector<Contestant>& contestants, unsigned int seed) {
// 计算总权重(总分之和)
long long totalWeight = 0;
for (const auto& c : contestants) {
totalWeight += c.totalScore;
}
if (totalWeight == 0) {
cerr << "错误:总分为0,无法抽奖" << endl;
return {};
}
// 为每位选手分配区间(保持原始顺序)
vector<pair<long long, string>> intervals;
long long current = 0;
for (const auto& c : contestants) {
if (c.totalScore > 0) {
intervals.push_back({current, c.id});
current += c.totalScore;
}
}
// 设置随机数生成器 - 使用mt19937
mt19937 rng(seed);
uniform_int_distribution<long long> dist(0, totalWeight - 1);
set<string> winners;
vector<string> allWinners;
// 奖项设置
int secondPrizeCount = 5; // 随机抽 5 个奖励 12.9元
int thirdPrizeCount = 50; // 随机抽 50 个奖励 1.29元
// 首先确定第一名(根据总分,同分平分奖励)
cout << "=== 确定第一名 ===" << endl;
int maxScore = 0;
vector<string> firstPrizeWinners;
// 找到最高分
for (const auto& c : contestants) {
if (c.totalScore > maxScore) {
maxScore = c.totalScore;
}
}
// 收集所有最高分选手
for (const auto& c : contestants) {
if (c.totalScore == maxScore) {
firstPrizeWinners.push_back(c.id);
}
}
cout << "最高分: " << maxScore << endl;
cout << "第一名获奖者 (" << firstPrizeWinners.size() << "人): ";
for (size_t i = 0; i < firstPrizeWinners.size(); i++) {
cout << firstPrizeWinners[i];
if (i < firstPrizeWinners.size() - 1) cout << ", ";
}
cout << endl;
// 第一名奖励加入总获奖名单
for (const auto& winner : firstPrizeWinners) {
winners.insert(winner);
allWinners.push_back(winner);
}
// 抽取第二名奖励(12.9元)
cout << "\n=== 抽取5个12.9元奖励 ===" << endl;
int secondPrizeDrawn = 0;
while (secondPrizeDrawn < secondPrizeCount) {
long long randomNum = dist(rng);
string winner = "";
// 查找中奖者
for (size_t j = 0; j < intervals.size() - 1; j++) {
if (randomNum >= intervals[j].first &&
randomNum < intervals[j + 1].first) {
winner = intervals[j].second;
break;
}
}
// 处理最后一个区间
if (winner.empty() && !intervals.empty() && randomNum >= intervals.back().first) {
winner = intervals.back().second;
}
// 检查是否已中奖
if (!winner.empty() && winners.count(winner) == 0) {
winners.insert(winner);
allWinners.push_back(winner);
secondPrizeDrawn++;
cout << " 第 " << secondPrizeDrawn << " 个12.9元奖励: " << winner
<< " (随机数: " << randomNum << ")" << endl;
}
}
// 抽取第三名奖励(1.29元)
cout << "\n=== 抽取50个1.29元奖励 ===" << endl;
int thirdPrizeDrawn = 0;
while (thirdPrizeDrawn < thirdPrizeCount) {
long long randomNum = dist(rng);
string winner = "";
// 查找中奖者
for (size_t j = 0; j < intervals.size() - 1; j++) {
if (randomNum >= intervals[j].first &&
randomNum < intervals[j + 1].first) {
winner = intervals[j].second;
break;
}
}
// 处理最后一个区间
if (winner.empty() && !intervals.empty() && randomNum >= intervals.back().first) {
winner = intervals.back().second;
}
// 检查是否已中奖
if (!winner.empty() && winners.count(winner) == 0) {
winners.insert(winner);
allWinners.push_back(winner);
thirdPrizeDrawn++;
// 每10个显示一次进度
if (thirdPrizeDrawn % 10 == 0) {
cout << " 已抽取 " << thirdPrizeDrawn << "/" << thirdPrizeCount << " 个1.29元奖励" << endl;
}
}
}
return allWinners;
}
// 保存结果到文件
void saveResultsToFile(const vector<string>& winners, const vector<Contestant>& contestants,
const string& filename, unsigned int seed) {
ofstream file(filename);
if (!file.is_open()) {
cerr << "错误:无法创建结果文件 " << filename << endl;
return;
}
file << "=== 抽奖结果 ===\n\n";
file << "抽奖种子: " << seed << "\n\n";
// 找到最高分和第一名获奖者
int maxScore = 0;
for (const auto& c : contestants) {
if (c.totalScore > maxScore) {
maxScore = c.totalScore;
}
}
vector<string> firstPrizeWinners;
for (const auto& c : contestants) {
if (c.totalScore == maxScore) {
firstPrizeWinners.push_back(c.id);
}
}
file << "=== 榜单原始顺序 ===" << endl;
for (size_t i = 0; i < contestants.size(); i++) {
file << i + 1 << ". " << left << setw(25) << contestants[i].id
<< " 总分: " << contestants[i].totalScore << endl;
}
file << "\n=== 获奖名单 ===" << endl;
// 第一名奖励
file << "\n1. 比赛第一名奖励(18元,同分平分):" << endl;
file << " 最高分: " << maxScore << endl;
file << " 获奖者 (" << firstPrizeWinners.size() << "人):" << endl;
for (size_t i = 0; i < firstPrizeWinners.size(); i++) {
file << " - " << firstPrizeWinners[i] << endl;
}
file << " 每人获得: " << fixed << setprecision(2) << 18.0 / firstPrizeWinners.size() << "元" << endl;
// 第二名奖励
file << "\n2. 随机抽取5个奖励(12.9元):" << endl;
size_t index = firstPrizeWinners.size();
for (int i = 0; i < 5 && index < winners.size(); i++) {
file << " - " << winners[index] << endl;
index++;
}
// 第三名奖励
file << "\n3. 随机抽取50个奖励(1.29元):" << endl;
for (int i = 0; i < 50 && index < winners.size(); i++) {
file << " " << setw(2) << (i+1) << ". " << winners[index] << endl;
index++;
}
file << "\n=== 注意事项 ===" << endl;
file << "1. 若比赛当天在犇犇中祝贺出题人生日快乐,则奖励数值乘 X" << endl;
file << " (X 为 at 到的出题人个数且至少为 1)" << endl;
file << "2. 获奖选手需要在抽奖结果发布的 72 小时内洛谷私信 ppip" << endl;
file << "3. 逾期作废" << endl;
file.close();
cout << "\n抽奖结果已保存到: " << filename << endl;
}
int main() {
string inputFile = "test.csv";
string outputFile = "抽奖结果.txt";
cout << "正在从 " << inputFile << " 读取榜单数据..." << endl;
// 从文件解析榜单
vector<Contestant> contestants = parseLeaderboardFromFile(inputFile);
if (contestants.empty()) {
cerr << "错误:没有读取到选手数据,请检查文件格式" << endl;
return 1;
}
// 输出选手信息(保持原始顺序)
cout << "\n=== 榜单原始顺序 ===" << endl;
cout << left << setw(5) << "序号" << setw(25) << "ID" << "总分" << endl;
cout << string(40, '-') << endl;
int totalScoreSum = 0;
for (size_t i = 0; i < contestants.size(); i++) {
cout << setw(5) << i+1 << setw(25) << contestants[i].id
<< contestants[i].totalScore << endl;
totalScoreSum += contestants[i].totalScore;
}
cout << "\n选手总分之和: " << totalScoreSum << endl;
// 计算种子
long long firstBloodSum = calculateFirstBloodSum();
long long modulus = 20260129; // 修正的模数
unsigned int seed = static_cast<unsigned int>(firstBloodSum % modulus);
cout << "\n=== 种子计算 ===" << endl;
cout << "一血RID列表: " << endl;
cout << " T723555 白井黑子: 259614130" << endl;
cout << " T724554 Adverse Present: 259608913" << endl;
cout << " T724556 Silent End: 259612115" << endl;
cout << " T724553 群星: 259634810" << endl;
cout << " T724664 For The Emperor!: 0" << endl;
cout << "一血RID之和: " << firstBloodSum << endl;
cout << "模数: " << modulus << endl;
cout << "抽奖种子: " << seed << endl;
cout << "\n=== 开始抽奖 ===" << endl;
cout << "奖品设置: " << endl;
cout << " 1. 第一名奖励: 同分平分18元" << endl;
cout << " 2. 随机抽取: 5个 (12.9元)" << endl;
cout << " 3. 随机抽取: 50个 (1.29元)" << endl;
// 进行抽奖
vector<string> winners = drawPrizes(contestants, seed);
// 输出结果
cout << "\n=== 抽奖结果 ===" << endl;
// 找到最高分和第一名获奖者
int maxScore = 0;
for (const auto& c : contestants) {
if (c.totalScore > maxScore) {
maxScore = c.totalScore;
}
}
vector<string> firstPrizeWinners;
for (const auto& c : contestants) {
if (c.totalScore == maxScore) {
firstPrizeWinners.push_back(c.id);
}
}
cout << "\n1. 比赛第一名奖励(18元,同分平分):" << endl;
cout << " 最高分: " << maxScore << endl;
cout << " 获奖者 (" << firstPrizeWinners.size() << "人):" << endl;
for (const auto& winner : firstPrizeWinners) {
cout << " - " << winner << endl;
}
cout << " 每人获得: " << fixed << setprecision(2) << 18.0 / firstPrizeWinners.size() << "元" << endl;
cout << "\n2. 随机抽取5个奖励(12.9元):" << endl;
size_t index = firstPrizeWinners.size();
for (int i = 0; i < 5 && index < winners.size(); i++) {
cout << " - " << winners[index] << endl;
index++;
}
cout << "\n3. 随机抽取50个奖励(1.29元):" << endl;
for (int i = 0; i < 50 && index < winners.size(); i++) {
cout << " " << setw(2) << (i+1) << ". " << left << setw(25) << winners[index];
index++;
if ((i + 1) % 2 == 0) cout << endl;
}
cout << endl;
cout << "\n共抽取 " << winners.size() << " 名获奖者" << endl;
// 保存结果到文件
saveResultsToFile(winners, contestants, outputFile, seed);
cout << "\n=== 注意事项 ===" << endl;
cout << "1. 若比赛当天在犇犇中祝贺出题人生日快乐,则奖励数值乘 X" << endl;
cout << " (X 为 at 到的出题人个数且至少为 1)" << endl;
cout << "2. 获奖选手需要在抽奖结果发布的 72 小时内洛谷私信 ppip" << endl;
cout << "3. 逾期作废" << endl;
// 显示一血RID详细计算
cout << "\n=== 一血RID详细计算 ===" << endl;
cout << "259614130 + 259608913 + 259612115 + 259634810 + 0 = " << firstBloodSum << endl;
cout << firstBloodSum << " mod " << modulus << " = " << seed << endl;
return 0;
}