1 条题解
-
0
解题思路分析
-
数据结构设计:
- 使用结构体
ROLE
存储球员信息,包括号码、姓名、位置、效力时间和选择标志。 - 通过
time
字段计算每个球员的总效力时间,即各段效力期的年数之和。
- 使用结构体
-
输入处理:
- 读取22名球员的信息,包括号码、姓名、位置和多段效力期。
- 解析效力期字符串,计算每个球员的总效力时间。
-
球员选择:
- 按号码升序排序,确保同位置球员按号码升序选择。
- 依次选择守门员、后卫、中场和前锋,每个位置的选择都从头遍历球员数组,确保选择号码最小的可用球员。
-
队长确定:
- 在已选球员中找出效力时间最长的作为队长;若时间相同,则选择号码更大的。
-
输出格式:
- 先输出队长信息,再按位置顺序输出其他球员,每个测试用例后有一个空行。
关键算法解析
-
效力时间计算:
- 遍历效力期字符串,提取起止年份,计算每段的年数并累加。
- 示例:
2000-2005
计算为6年(2000至2005共6个年份)。
-
球员选择逻辑:
- 使用
flag
标记已选球员,确保每个位置选择指定数量的球员。 - 守门员固定选择1名,后卫、中场、前锋按阵型要求数量选择。
- 使用
-
队长选择逻辑:
- 遍历所有已选球员,找出效力时间最长且号码最大的球员。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; struct ROLE { int num; char name[47]; char R; int time; int flag; } p[47]; bool cmp1(ROLE a, ROLE b) { return a.num < b.num; } bool cmp2(ROLE a, ROLE b) { return a.flag < b.flag; } int main() { char s[700]; while(scanf("%d",&p[0].num)!=EOF) { if(p[0].num == 0) break; for(int i = 0; i < 27; i++) p[i].flag = 0; for(int i = 0; i < 22; i++) { memset(s,'\0',sizeof(s)); int sum = 0; if(i > 0) scanf("%d",&p[i].num); scanf("%s",p[i].name); getchar(); scanf("%c",&p[i].R); gets(s); for(int j = 0; j < strlen(s)-4; j++) { if(s[j]==' ') continue; int t1 = 0, t2 = 0; for(int l = j; l < j+4; l++) { t1=t1*10+s[l]-'0'; } j+=4; if(s[j] == '-') { for(int l = j+1; l < j+5; l++) { t2=t2*10+s[l]-'0'; } } j+=5; sum+=t2-t1+1; } p[i].time = sum; //printf("%d....\n",sum); } sort(p,p+22,cmp1); char ss[17]; scanf("%s",ss); int a, b, c; a = ss[0]-'0'; b = ss[2]-'0'; c = ss[4]-'0'; //printf("%d %d %d\n",a,b,c); int l = 1; for(int i = 0; i < 22; i++) { if(p[i].R == 'G') { p[i].flag = l; l++; break; } } for(int i = 0; i < a; i++) { for(int j = 0; j < 22; j++) { if(p[j].R == 'D' && p[j].flag==0) { p[j].flag = l; l++; break; } } } for(int i = 0; i < b; i++) { for(int j = 0; j < 22; j++) { if(p[j].R == 'M' && p[j].flag==0) { p[j].flag = l; l++; break; } } } for(int i = 0; i < c; i++) { for(int j = 0; j < 22; j++) { if(p[j].R == 'S' && p[j].flag==0) { p[j].flag = l; l++; break; } } } if(l!=12 ||(a+b+c!=10)) { printf("IMPOSSIBLE TO ARRANGE\n\n"); continue; } sort(p,p+22,cmp2); int maxx = -1; int pos = 0; for(int i = 0; i < 22; i++) { if(p[i].flag && p[i].time > maxx) { maxx = p[i].time; pos = i; } else if(p[i].flag && p[i].time == maxx) { if(p[pos].num < p[i].num) pos = i; } } printf("%d %s %c\n",p[pos].num,p[pos].name,p[pos].R); for(int i = 0; i < 22; i++) { if(p[i].flag && i!=pos) printf("%d %s %c\n",p[i].num,p[i].name,p[i].R); } printf("\n"); } return 0; }
-
- 1
信息
- ID
- 2340
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者