1 条题解

  • 0
    @ 2025-5-27 13:21:07

    解题思路分析

    1. 数据结构设计

      • 使用结构体ROLE存储球员信息,包括号码、姓名、位置、效力时间和选择标志。
      • 通过time字段计算每个球员的总效力时间,即各段效力期的年数之和。
    2. 输入处理

      • 读取22名球员的信息,包括号码、姓名、位置和多段效力期。
      • 解析效力期字符串,计算每个球员的总效力时间。
    3. 球员选择

      • 按号码升序排序,确保同位置球员按号码升序选择。
      • 依次选择守门员、后卫、中场和前锋,每个位置的选择都从头遍历球员数组,确保选择号码最小的可用球员。
    4. 队长确定

      • 在已选球员中找出效力时间最长的作为队长;若时间相同,则选择号码更大的。
    5. 输出格式

      • 先输出队长信息,再按位置顺序输出其他球员,每个测试用例后有一个空行。

    关键算法解析

    1. 效力时间计算

      • 遍历效力期字符串,提取起止年份,计算每段的年数并累加。
      • 示例:2000-2005计算为6年(2000至2005共6个年份)。
    2. 球员选择逻辑

      • 使用flag标记已选球员,确保每个位置选择指定数量的球员。
      • 守门员固定选择1名,后卫、中场、前锋按阵型要求数量选择。
    3. 队长选择逻辑

      • 遍历所有已选球员,找出效力时间最长且号码最大的球员。
    #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
    上传者