班委选举

Description

高考的脚步越来越近了……时间如山涧小溪一般悄无声息地流走,一去不复还……曾几何时嬉笑的最后一排,如今也已经被大大小小的书本填完,我们从未有过为一件事如此认真过,但我们坚信我们的付出是值得的。

班长曲琪打破了班级久久的寂静。她咳了咳嗽,缓缓地走上讲台,学习委员乔伊也起身走向讲台。

“我们将进行我们最后一次班委选举,对吧副班长”。曲琪虽然尽力使用高兴的语气,但是难掩心中的将要与他离别和与他不确定的未来的惆怅。 title

“我是学委”。乔伊再一次提醒曲琪,然而曲琪总是喜欢叫他副班长。乔伊紧接着说:“作为我们最后一次的班委选举,我和曲琪想了很多选择方式,我们接下来要展示的是我们的选拔标准”。

曲琪将手里的方案书打开,无意间一个小小盒子从手里掉了出来,曲琪马上把盒子捡了起来-那可是给他的生日礼物-一盒小小的曲奇饼。

“每……每位学生只能担任一个职务,不可以……不可以担任多个职务”,曲琪的心里小鹿乱撞生怕被他看到了礼物,涨红着脸读着方案书。

“我们将选出6位课代表,根据梅老师的带班经验一个班级的学习能力等于各科课代表的对应学科的学科能力总和”。 title

梅老师说:“同学们,我通过各科老师给你们的各科学习能力评了分用一个0-100以内的整数表示,作为你们的班主任我想通过这次的班委选举,全力提高我们的班级学习能力。” title

罗小涵:“求最大的班级学习能力这种事情还是很容易直接算出的吧,对吧”。

你:“怎么可能啊,N个人快N^6种安排方式,你看木馨算了好久了,都没有算出来,呀,她怎么睡着了”。

罗小涵:“……迟钝”。

Input

输入一个整数N(6<=N<=1000)表示你班级的人数。

接下去N行,第i行有6个整数pi(0<=pi<=100)表示第i个人的语文,数学,英语,化学,物理,生物能力。

Output

输出一个数表示这个班级的最大的班级学习能力(各科课代表的对应学科的学科能力总和)。

Sample Input

6
41 85 72 38 80 69
65 68 96 22 49 67
51 61 63 87 66 24
80 83 71 60 64 52
90 60 49 31 23 99
94 11 25 24 51 15

Sample Output

539

这题明显暴力是行不通的,所以要优化一下。从题目的要求可知,只要6个人选就Ok了。所以只要从每列中选前6个,之后再在6课的前六个暴力枚举就是答案了。

AC代码:

#include<iostream>
#include<functional>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
#define CRL(a) memset(a,0,sizeof(a))
#define QWQ ios::sync_with_stdio(0)
typedef unsigned long long LL;
typedef  long long ll;
#define CMP bool cmp(const node& a,const node& b){	return a.R<b.R||(a.R==b.R&&a.L<b.L); }
const int T = 1555;
const int mod = 1000000007;

struct node
{
	int v[6];
	int num;
}a[1010];

struct Node
{
	int v,id;
	Node(){}
	Node(int _v,int _id):v(_v),id(_id){}
}tar[6][6];

int num,ans;

bool cmp(const node& x,const node& y)
{
	return x.v[num]>y.v[num]; 
}

bool vis[T];

void DFS(int x,int val)
{
	if(x>=6){
		ans = max(ans,val);
		return;
	}
	for(int i=0;i<6;++i){
		if(vis[tar[i][x].id])continue;
		vis[tar[i][x].id] = true;
		DFS(x+1,val+tar[i][x].v);
		vis[tar[i][x].id] = false;
	}
}

int main()
{

#ifdef zsc
	freopen("input.txt","r",stdin);
#endif

	int i,j,k,n,m;

	while(~scanf("%d",&n))
	{
		ans = 0;
		fill(vis,vis+10,false);
		for(i=0;i<n;++i){
			for(j=0;j<6;++j)
			scanf("%d",&a[i].v[j]);
			a[i].num = i;
		}
		for(num=0;num<6;++num){
			sort(a,a+n,cmp);
			for(i=0;i<6;++i){
				tar[i][num] = Node(a[i].v[num],a[i].num);
			}
		}
		DFS(0,0);
		printf("%d\n",ans);
	}

    return 0;
}