云剪贴板

云剪贴板 bbjdd34j

公开

云剪贴板操作

ppip2026/01/29 22:20 创建,当前公开

当前快照
1 份
快照标识符
@mlgxt554
此快照首次捕获于
2026/02/11 02:31
上周
此快照最后确认于
2026/02/11 02:31
上周
查看原剪贴板
=== 抽奖结果 ===
  1. 比赛第一名奖励(18元,同分平分): 最高分: 350 获奖者 (1人):
    • legendcn666 每人获得: 18.00元
  2. 随机抽取5个奖励(12.9元):
    • masy2011
    • ygwlan
    • qinhuanmma
    • Syzygy_
    • hopeful_imitation
  3. 随机抽取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;
}