洛谷 CF431B

题意翻译

题目描述

学生宿舍里只有一个淋浴,有很多个学生希望早上洗澡。这就是为什么每天早上宿舍门口有五个人排队的原因。淋浴一打开,第一个人就从队里进入淋浴。一段时间后,第一个人离开淋浴,下一个人进入淋浴。这个过程一直持续到每个人淋浴过。 洗澡需要一些时间,所以排队的学生在这时讲话。学生们成对交谈:第 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值