问一下我错哪了
题:
P3887 [GDOI2014]世界杯
题目描述
3014 年世界杯足球赛就要开始了!作为卫冕冠军中国足球队的教练,手下每位球员都是猛将,如何摆出最强的 11 人阵容也是一件幸福的烦恼事啊。
众所周知,足球阵容里的11个球员都会被分配到场上某一个特别的位置,而这些位置主要分为守门员、后卫、中场和前锋四种,其中守门员有且只有一个,后卫、中场和前锋的人数取决于你安排的足球阵型。形容足球阵型的方法由后卫开始计算至前锋,但不把守门员计算在内。例如,3-5-2 阵型是指有三个后卫、五个中场及两名前锋。由于竞争激烈,每位球员只会培养其中一种位置所需要的技能,所以他们每个人都只能胜任四个位置中的其中一种。
作为一个对球员能力了如指掌的教练,你给每个球员的综合水平进行量化。为了将阵型安排得更好,你的教练团队决定使用以下策略安排球员:首先按照顺序提出 Q 个阵型,分别代表第一阵型、第二阵型、……、第 Q 阵型。然后对于每个阵型,从仍未选择的球员中选择最好的对应数量的守门员、后卫、中场和前锋。比如说,对于第一阵型,在所有球员中选择;对于第二阵型,在除了第一阵型外的所有球员中选择;对于第三阵型,在除了第一阵型和第二阵型外的所有球员中选择;以此类推。
现在 Q个阵型都已经确定,而你需要知道的,是每个阵型的平均综合水平分别是多少。
输入格式
第一行有四个整数 K, D, M, F,分别表示守门员、后卫、中场和前锋供挑选的球员人数。
第二行有 K 个整数 ki,分别表示每个守门员的综合水平值。
第三行有 D 个整数 di,分别表示每个后卫的综合水平值。
第四行有 M 个整数 mi,分别表示每个中场的综合水平值。
第五行有 F个整数 fi,分别表示每个前锋的综合水平值。
第六行有一个整数 Q,表示教练团队提出的阵型个数。
以下 Q 行,第 i 行三个整数 Ai,Bi,Ci,由空格间隔,表示第 i 阵型是 Ai−Bi−Ci 阵型。
输出格式
输出 Q 行。对于第 i 种阵型,输出一个实数,表示该阵型平均综合水平的最大值,并四舍五入到小数点后 2 位。
输入输出样例
输入 #1复制
3 10 12 4
76 60 87
78 84 84 84 81 82 72 51 77 57
85 84 62 87 88 64 81 90 80 66 88 85
65 83 63 79
2
4 5 1
4 4 2
输出 #1复制
85.64
78.00
说明/提示
对于 30% 数据, K,D,M,F≤1000, Q≤10;
对于 100% 数据, 1≤K,D,M,F≤105, 0≤ki,di,mi,fi≤108,1≤Q≤K1≤Q≤K, 0≤Ai,Bi,Ci≤10, Ai+Bi+Ci=10
代码(运行有错):
#include
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int sm,hw,zc,qf;
cin>>sm>>hw>>zc>>qf;
int smq[10005],hwq[10005],zcq[10005],qfq[10005];
for(int i=0;i
for(int i=0;i
for(int i=0;i
for(int i=0;i
int q;
cin>>q;
int a[10005],b[10005],c[10005];
for(int i=0;i
{
cin>>a[i]>>b[i]>>c[i];
}
sort(smq,smq+sm,cmp);
sort(hwq,hwq+hw,cmp);
sort(zcq,zcq+zc,cmp);
sort(qfq,qfq+qf,cmp);
long long ans=0;
int d=0;
for(int i=0;i
{
for(int i1=hw-1;i1>=0;i1--)
{
if(d
{
ans=ans+hwq[i];
hwq[i1]=0;
d++;
}
else if(d==a[i])
{
d=0;
break;
}
}
for(int i2=zc;i2>=0;i2--)
{
if(d
{
ans=ans+zcq[i];
zcq[i2]=0;
d++;
}
else if(d==b[i])
{
d=0;
break;
}
}
for(int i3=qf-1;i3>=0;i3--)
{
if(d
{
ans=ans+qfq[i];
qfq[i3]=0;
d++;
}
else if(d==c[i])
{
d=0;
break;
}
}
ans=ans+smq[sm-1-i];
cout<2)<1.0/11<0;
}
return 0;
}