1 条题解

  • 0
    @ 2025-5-27 22:25:22

    算法思路

    1. 输入处理:读取选手数量n和差异阈值d,然后读取每个选手的两个属性值x和y。
    2. 全排列枚举:使用next_permutation生成所有可能的选手排列顺序。
    3. 模拟比赛过程
      • 按照当前排列顺序逐个将选手分配到A队或B队
      • 初始时选手加入A队
      • 当A队总x值比B队多超过d时,切换到B队
      • 当B队总x值比A队多超过d时,切换回A队
    4. 记录最大值:在所有排列中,记录B队总y值的最大值。

    关键点

    • 使用全排列来考虑所有可能的选手分配顺序
    • 动态切换队伍的机制基于两队x属性总和的差值
    • 目标是最大化B队的y属性总和

    复杂度分析

    • 时间复杂度:O(n!*n),因为需要枚举所有排列并对每个排列进行线性处理
    • 空间复杂度:O(n),用于存储选手数据和排列
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int a,b,c[11];
    struct array
    {
    	int x,y;
    }s[11];
    int main()
    {
    	int n,d,i,j;
    	scanf("%d%d",&n,&d);
    	{
    		int sa=0,sb=0;
    		for(i=1;i<=n;i++)
    		{
    			scanf("%d%d",&s[i].x,&s[i].y);
    		}
    		for(i=0;i<n;i++)
    			c[i]=i+1;
    		int maxn = -100;
    		do
    		{
    			a=0,b=0;sa=0;sb=0;j=1;
    			for(i=0;i<n;i++)
    			{
    				if(j==1)
    				{
    					sa=sa+s[c[i]].x;
    					a+=s[c[i]].y;
    					if(sa-sb>d)
    						j=2;
    				}
    				else if(j==2)
    				{
    					sb+=s[c[i]].x;b+=s[c[i]].y;
    					if(sb-sa>d)
    						j= 1;
    				}
    			}
    			if(maxn <b)maxn=b;
    		}while(next_permutation(c,c+n));
    		printf("%d\n",maxn);
    	}
    }
    
    • 1

    信息

    ID
    2401
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者