[XUJCOJ] 2023天梯赛校内选拔赛

记录部分题目 8:常规赛排名 描述 一场常规赛需要参赛双方进行至多三局游戏来决出胜者(先赢两局者胜)。 赢得一场常规赛可以为战队获取 1 个场次分,输掉一场常规赛则无事发生。 同时,每赢得一局游戏可以为战队获取 1 个游戏分,输掉一局游戏则会失去 1 个游戏分。 例如 TeamA 和 TeamB 的游戏结果是 2:1,那么本场比赛结束后,TeamA 获得 1 个场次分和 1 个游戏分,TeamB 只失去 1 个游戏分。 具体排名规则如下: 优先按照场次分高低排名,场次分相同的,则按照游戏分从高到低排名,仍然相同的,则按照战队名称的字典序从小到大排。 输入 第一行是一个正整数 n 表示总共的常规赛场次。(1 ≤ n ≤ 105) 接下来 n 行,每行包含两个字符串和一个比分,表示参赛双方的战况。 战队名称仅包含大小写字母且长度不超过 10,比分只会是 0:2、1:2、2:1、2:0 中的一个。 输出 按排名规则的顺序输出若干行,每行包括:战队名 场次分 游戏分。 样例输入 3 TeamA TeamB 2:1 TeamB TeamC 2:0 TeamA TeamC 1:2 样例输出 TeamB 1 1 TeamA 1 0 TeamC 1 -1 思路 这是一道模拟题,需要模拟比赛过程并统计每个队伍的分数。我们可以使用一个unordered_map来存储每个队伍的信息,使用一个结构体Team来表示每个队伍的名称、场次分和游戏分。对于每一场比赛,我们可以解析输入并根据比分更新每个队伍的信息。如果某个队伍赢了比赛,它的场次分和游戏分都会增加;如果它输了比赛,则它的游戏分会减少。 一旦我们统计了每个队伍的分数,我们可以将它们放入一个vector中,并使用一个compare函数对它们进行排序,以便根据场次分、游戏分和队伍名称的字典序输出排名。最后,我们遍历排好序的vector并输出每个队伍的信息。 总之,这道题的思路比较简单,重点在于正确解析输入并更新每个队伍的信息。我们需要考虑所有可能的比分情况,并使用一个unordered_map来快速查找每个队伍的信息。 代码 #include <iostream> #include <vector> #include <string> #include <unordered_map> #include <algorithm> #include <sstream> using namespace std; struct Team { string name; int matches_won; int game_points; }; bool compare(const Team& a, const Team& b) { if (a.matches_won == b.matches_won) { if (a.game_points == b.game_points) { return a.name < b.name; } return a.game_points > b.game_points; } return a.matches_won > b.matches_won; } int main() { int n; cin >> n; cin.ignore(); unordered_map<string, Team> teams; for (int i = 0; i < n; ++i) { string line; getline(cin, line); istringstream iss(line); string team1, team2; char delimiter; int score1, score2; iss >> team1 >> team2 >> score1 >> delimiter >> score2; if (score1 > score2) { teams[team1].matches_won++; teams[team1].game_points += (score1 - score2); teams[team2].game_points -= (score1 - score2); } else { teams[team2].matches_won++; teams[team2].game_points += (score2 - score1); teams[team1].game_points -= (score2 - score1); } teams[team1].name = team1; teams[team2].name = team2; } vector<Team> team_list; for (const auto& team : teams) { team_list.push_back(team.second); } sort(team_list.begin(), team_list.end(), compare); for (const auto& team : team_list) { cout << team.name << " " << team.matches_won << " " << team.game_points << endl; } return 0; } 9:炉石传说-沉没之城 描述 小卢在玩某款卡牌游戏,每个回合中,他可以执行以下三种操作任意次。 ...

March 18, 2023 · 4 min · Red

[重返NOIP] 模拟——NOIP2006 提高组 作业调度方案

题目描述 我们现在要利用 m 台机器加工 n 个工件,每个工件都有 m 道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作,我们用记号 j-k 表示一个操作,其中 j 为 1 到 n 中的某个数字,为工件号; k 为 1 到 m 中的某个数字,为工序号,例如 2-4 表示第 2 个工件第 4 道工序的这个操作。在本题中,我们还给定对于各操作的一个安排顺序。 例如,当 n=3,m=2 时,1-1,1-2,2-1,3-1,3-2,2-2 就是一个给定的安排顺序,即先安排第 1 个工件的第 1 个工序,再安排第 1 个工件的第 2 个工序,然后再安排第 2 个工件的第 1 个工序,等等。 一方面,每个操作的安排都要满足以下的两个约束条件。 对同一个工件,每道工序必须在它前面的工序完成后才能开始; 同一时刻每一台机器至多只能加工一个工件。 另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。 由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为 1 1 2 3 3 2。 还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际操作顺序。在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。 例如,取 n=3,m=2 ,已知数据如下(机器号/加工时间): 工件号 工序 1 工序 2 1 1/3 2/2 2 1/2 2/5 3 2/2 1/4 则对于安排顺序 1 1 2 3 3 2,下图中的两个实施方案都是正确的。但所需要的总时间分别是 10 与 12 。 ...

March 15, 2023 · 2 min · Red

[issue]关于近期发现洛谷判题错误的求证

不知道有没有人遇到和我一样的问题 近日突然想起来洛谷部分题目存在判断失误问题(包括之前遇到过的一些题已经忘记题号),以下面两道题为例,贴出我的得分情况、输出情况和代码(已确认无空格和换行等差异) P1067 我的代码 #include<stdio.h> int main(){ int n,t; scanf("%d",&n); t=n; while(n--){ int a; scanf("%d",&a); if(n!=0){ if(a>0&&(a!=1&&a!=-1)){ if(t==n+1) printf("%dx^%d",a,n+1); else printf("+%dx^%d",a,n+1); }else if(a==-1||a==1){ if(a>0&&t==n+1) printf("x^%d",n+1); else if(a>0&&t!=n+1) printf("+x^%d",n+1); else printf("-x^%d",n+1); }else if(a<0&&(a!=1&&a!=-1)){ printf("%dx^%d",a,n+1); }else{ t--; } } else{ if(a>0&&(a!=1&&a!=-1)){ if(t==n+1) printf("%dx",a); else printf("+%dx",a); }else if(a==-1||a==1){ if(a>0&&t==n+1) printf("x"); else if(a>0&&t!=n+1) printf("+x"); else printf("-x"); }else if(a<0&&(a!=1&&a!=-1)){ printf("%dx",a); }else{ t--; } } } int a; scanf("%d",&a); if(a>0&&t!=0) printf("+"); printf("%d\n",a); } AC代码 #include <bits/stdc++.h> using namespace std; int main() { int n,a,i; cin>>n; for(i=n;i>=0;i--) { cin>>a; if(a) { if(i!=n&&a>0) cout<<"+"; if(abs(a)>1||i==0) cout<<a; if(a==-1&&i) cout<<"-"; if(i>1) cout<<"x^"<<i; if(i==1) cout<<"x"; } } return 0; } P1098 这道题只下载了第7个测试点 ...

March 13, 2023 · 2 min · Red

[重返NOIP] 模拟——NOIP2009 普及组 多项式输出

题目描述 一元 n 次多项式可用如下的表达式表示: f(x)=a_nx^n+a_{n-1}x^{n-1}+ … +a_1x+a_0,a_n> 0 其中, a_ix^i 称为 i 次项, a_i 称为 i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 多项式中自变量为 x ,从左到右按照次数递减顺序给出多项式。 多项式中只包含系数不为 0 的项。 如果多项式 n 次项系数为正,则多项式开头不出 + 号,如果多项式 n 次项系数为负,则多项式以 - 号开头。 对于不是最高次的项,以 + 号或者 - 号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 0 次的项,其系数的绝对值为 1 ,则无需输出 1 )。如果 x 的指数大于 1 ,则接下来紧跟的指数部分的形式为“ x^b ”,其中 b 为 x 的指数;如果 x 的指数为 1 ,则接下来紧跟的指数部分形式为 x ;如果 x 的指数为 0 ,则仅需输出系数即可。 多项式中,多项式的开头、结尾不含多余的空格。 输入格式 输入共有 2 行 第一行 1 个整数, n ,表示一元多项式的次数。 ...

March 7, 2023 · 2 min · Red

[洛谷] P4924 魔法少女小Scarlet

题目描述 Scarlet 最近学会了一个数组魔法,她会在 n* n 二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转 90° 。 首先,Scarlet 会把 1 到 n^2 的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施放一些简易的魔法。 Scarlet 既不会什么分块特技,也不会什么 Splay 套 Splay,她现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。 输入格式 第一行两个整数 n,m ,表示方阵大小和魔法施放次数。 接下来 m 行,每行 4 个整数 x,y,r,z ,表示在这次魔法中,Scarlet 会把以第 x 行第 y 列为中心的 2r+1 阶矩阵按照某种时针方向旋转,其中 z=0 表示顺时针, z=1 表示逆时针。 输出格式 输出 n 行,每行 n 个用空格隔开的数,表示最终所得的矩阵 样例 #1 样例输入 #1 5 4 2 2 1 0 3 3 1 1 4 4 1 0 3 3 2 1 样例输出 #1 5 10 3 18 15 4 19 8 17 20 1 14 23 24 25 6 9 2 7 22 11 12 13 16 21 提示 对于50%的数据,满足 r=1 ...

March 6, 2023 · 2 min · Red