列表

详情


NC214730. WoodCube

描述

Wood Cube 是两个完全相同的能量立方体,其六个面有着不同的属性,每个面上都刻有一个数字,代表该面蕴含的能量大小。传说中,Wood Cube 是隐藏着巨大力量的古代兵器,只要得到两个 Wood Cube ,就能征服这个世界。
mio 是一个平凡的大学生。这天,她来商场购买新的发卡,或许是在命运的指引下,mio 走进了一家装饰古怪的发卡店。这家发卡店只售卖立方体形状的发卡,而这些发卡被等距离地排成一行,每个发卡之间的距离为1。
一进入店中,关于 Wood Cube 的传说就涌入了 mio 的脑海。瞬间,mio 意识到了力量的指引,这些发卡中一定就有着传说中的 Wood Cube!mio 知道,Wood Cude 之间会相互吸引,所以两个 Wood Cube 之间的距离不可能超过 d。可惜,mio 并不能察觉到这些发卡中哪两个才是真正的 Wood Cube (每个发卡六个面上都刻有数字,与 Wood Cube 外观相同),而她带的钱也只够买两个发卡。于是她决定,在所有发卡中选择两个距离不超过 d 且完全相同的发卡,而如果有多种满足条件的情况,则选择其中六个面数字之和最大的发卡。
注:设发卡六个面分别为 1, 2, 3, 4, 5, 6,两个发卡完全相同指对于任意 面,两者所刻的数字都相同。由于每个面的属性不同,不能通过翻转使两个不同的发卡变得相同。

输入描述

第一行为两个整数  ,分别表示发卡的个数和 Wood Cube 的距离限制。
接下来的 n 行,每行 6 个整数,第 i+1 行的第 j 个整数 表示第 i 个发卡第 j 面所刻的数字。

输出描述

输出一个整数,表示 mio 最后选择的发卡中其中一个六个面的数字之和,如果无解,输出"0"。

示例1

输入:

6 3
1 2 3 4 5 6
1 3 4 5 7 10
1 3 4 5 7 10
1 3 4 5 10 11
10 10 11 12 13 12
11 12 100 18 20 10

输出:

30

示例2

输入:

5 3
10 11 123 11 80 6
1 2 3 4 5 6
10 11 123 11 80 6
2 3 4 6 1 3
8 0 1 2 3 4

输出:

241

示例3

输入:

5 1
1 2 3 4 5 6
10 11 12 13 14 15
1 2 3 4 5 6
10 11 12 13 14 15
3 4 5 19 12 31

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 82ms, 内存消耗: 3044K, 提交时间: 2020-12-26 14:53:32

#include<stdio.h>
#include<string.h>
int a[100000][6];
int sum[100000];
int main(void)
{
	int n,d,max=0;
	scanf("%d%d",&n,&d);
	int i,j,k,same;
	for(i=0; i<n; i++)
		for(j=0; j<6; j++)
			{
				scanf("%d",&a[i][j]);
				sum[i]+=a[i][j];
			}
	for(i=0; i<n-2; i++)
		{
			if(sum[i]<=max)
				continue;
			for(j=i+1; j-i<=d&&j<n; j++)
				{
					same=0;
					if(sum[j]==sum[i])
						{
							same=1;
							for(k=0; k<6; k++)
								if(a[i][k]!=a[j][k])
									{
										same=0;
										break;
									}
						}
					if(same)
						{
							if(sum[i]>max)
								max=sum[i];
						}
				}
		}
	printf("%d",max);
	return 0;
}

C++(clang++11) 解法, 执行用时: 92ms, 内存消耗: 6188K, 提交时间: 2021-01-22 15:14:08

#include<bits/stdc++.h>
using namespace std;
unsigned long long t=0,base=1e9+7;
unordered_map<unsigned long long,int>V;
int main()
{
	int i,j,k,x,n,d,ans=0;
	scanf("%d%d",&n,&d);
	for(i=1;i<=n;i++)
	{
		for(t=x=j=0;j<6;j++)
		scanf("%d",&k),t=t*base+k,x+=k;
		if(V[t]&&i-V[t]<=d)
		ans=max(ans,x);
		V[t]=i;
	}
	printf("%d",ans);
	return 0;
}

上一题