1 条题解
-
0
算法思路
- 输入处理:读取选手数量n和差异阈值d,然后读取每个选手的两个属性值x和y。
- 全排列枚举:使用
next_permutation
生成所有可能的选手排列顺序。 - 模拟比赛过程:
- 按照当前排列顺序逐个将选手分配到A队或B队
- 初始时选手加入A队
- 当A队总x值比B队多超过d时,切换到B队
- 当B队总x值比A队多超过d时,切换回A队
- 记录最大值:在所有排列中,记录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
- 上传者