题意翻译
题目描述
学生宿舍里只有一个淋浴,有很多个学生希望早上洗澡。这就是为什么每天早上宿舍门口有五个人排队的原因。淋浴一打开,第一个人就从队里进入淋浴。一段时间后,第一个人离开淋浴,下一个人进入淋浴。这个过程一直持续到每个人淋浴过。 洗澡需要一些时间,所以排队的学生在这时讲话。学生们成对交谈:第 2×i−1个人与第 2×i 个人交谈。 更详细些,把人数从 1 到 5 编号,让我们假设队列最初看起来是 23154(编号 2 的人位于队列的开头),然后,在淋浴开始前,2 和 3 谈话, 1 和 5 谈话,4 没有任何人交谈,2 洗澡时 3 和 1 交谈,5 和 4 交谈,3 洗澡时,1 和 5 聊天,4 没有任何人交谈,1 洗澡时,5 和 4 聊天,然后 5 淋浴,4 淋浴。 我们知道如果 i 和 j 交谈,i 的幸福值增加 gi,j ,j 的幸福值增加 gj,i,你的任务是找到这样一排学生最初的顺序,使得所有学生的幸福感和最终达到最大。
输入格式
输入共五行,每行输入五个用空格分隔的整数。第 ii 行的第 jj 个整数代表 gi,j。保证对于所有 i 的 gi,i=0。
输出格式
输出共 1 行,输出学生最大的总幸福感.
输入输出样例
输入 #1复制
0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0输出 #1复制
32输入 #2复制
0 43 21 18 2 3 0 21 11 65 5 2 0 1 4 54 62 12 0 99 87 64 81 33 0输出 #2复制
620
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#define continue continue
#define int int
#define double double
#define register register
using namespace std;
void open_file(string a){
freopen(string(a+".in").c_str(),"r",stdin);
freopen(string(a+".out").c_str(),"w",stdout);
}
int ans[6][6];
int x[6];
signed main(){
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
cin>>ans[i][j];
}
}
long long ans1=-LONG_LONG_MAX;
for(int i=1;i<=5;i++)x[i]=i;
do{
long long sum=0;
sum=ans[x[1]][x[2]]+ans[x[3]][x[4]]+ans[x[2]][x[3]]+ans[x[4]][x[5]]+ans[x[3]][x[4]]+ans[x[4]][x[5]]+
ans[x[2]][x[1]]+ans[x[4]][x[3]]+ans[x[3]][x[2]]+ans[x[5]][x[4]]+ans[x[4]][x[3]]+ans[x[5]][x[4]];
ans1=max(sum,ans1);
}while(next_permutation(x+1,x+6));
cout<<ans1;
return 0;
}