题解洛谷P3887(c++解法)[GDOI2014]世界杯

思路:守门员单算,比较简单,剩下三种类型的拿中场说。
假设你有16个中场球员,他们是:(表格纯手打)(剩下几名球员power从60到72不等)

 -------------- --------------  
|   name       | power        |
| -----------: | -----------: |
|    666       | 22           |
|    god       | 88           |
|    messi     | 99           |
|              |              |
 -------------- --------------

4套阵容,分别要求3,4,3,6个中场球员
那第一套肯定是god,messi和72的那位了。
你会发现一个规律:
排完序后,power 分别是 99,88,72,71,70,69,68,67……60,22
每次抽剩下人里的前i个就行了。
代码如下

#include 
using namespace std;
int a[100005],b[100005],c[100005],d[100005];
int k,g,f,m,q;
double tbh;
bool cmp(int a,int b){//从大至少排序
    return a>b;
}
int main(){
    cin>>k>>g>>f>>m;
    for(int i=1;i<=k;i++)
       cin>>a[i];
    for(int i=1;i<=g;i++)
       cin>>b[i];
    for(int i=1;i<=f;i++)
       cin>>c[i];
    for(int i=1;i<=m;i++) //往死里输入
       cin>>d[i];
    sort(a+1,a+k+1,cmp);
    sort(b+1,b+g+1,cmp);
    sort(c+1,c+f+1,cmp);
    sort(d+1,d+m+1,cmp);//往死里排序
    cin>>q;
    int l,z,y;
    int x=1,r=1,w=1,h=1;
    int sss;
    while(q--){
    	cin>>l>>z>>y;
    	tbh=0;
    	tbh+=a[x];//守门员
    	x++;//序号++
    	for(int i=r;i<r+l;i++)
    	   tbh+=b[i];//后卫
    	r+=l;
    	for(int i=w;i<w+z;i++)
    	   tbh+=c[i];//中场
    	w+=z;
    	for(int i=h;i<h+y;i++)
    	   tbh+=d[i];//前锋
    	h+=y;
    	printf("%.2f\n",tbh/11);//一共十一人
    }
    return 0;
}

你可能感兴趣的:(题解洛谷P3887(c++解法)[GDOI2014]世界杯)