1 条题解

  • 0
    @ 2025-4-21 22:32:46

    题意分析

    Chun-Soo正在玩一个骰子堆叠游戏。每个骰子有六个面,分别标有数字1到6。这些骰子不是标准的,即对面数字之和不一定是7。 游戏规则: 将多个骰子按顺序堆叠,骰子1在最底部。 每对相邻骰子的接触面必须具有相同的数字。 堆叠后,通过旋转骰子,可以自由设置顶面和底面,但其他四个面必须保持垂直。 目标: 找到一种堆叠方式,使得一个侧面的数字总和最大

    输入: 第一行包含一个整数 t,表示测试用例的数量。 每个测试用例的第一行包含一个整数 n,表示骰子的数量。 接下来的 n 行,每行包含六个整数,表示一个骰子的六个面。 输出: 每个测试用例应有一行输出,其中包含一个侧面的最大数字总和。

    解题思路

    1.理解骰子的面: 每个骰子有六个面,分别用0到5索引表示。op(x)op(x) 函数用于找到与面 x 相对的面。

    2.计算最大侧面和: 对于每个可能的底面(0到5),尝试将骰子堆叠起来。计算除顶面和底面外的最大面值。找到下一个骰子的底面,使得其与当前骰子的顶面匹配。

    3.模拟堆叠过程: 从第一个骰子开始,选择一个底面。对于每个后续的骰子,找到其底面,使得其与前一个骰子的顶面匹配。累加每个骰子的最大侧面值。

    4.更新最大值: 对于每个可能的底面,计算堆叠后的侧面总和。更新最大侧面总和。

    代码实现

    #include<cstdio>
    using namespace std;
    
    int dice[10000][10];
    int t, n;
    
    int op(int x){
    	switch(x){
    		case 0:	return 5;
    		case 1: return 3;
    		case 2: return 4;
    		case 3: return 1;
    		case 4: return 2;
    		case 5: return 0;
    	}
    }
    
    int maxside(int arr[], int bottom, int top){
    	int max = 0;
    	for(int i=0; i<6; i++){
    		if(i!=bottom && i!=top)
    			if(arr[i]>max)
    				max = arr[i];
    	}
    	return max;
    }
    
    int find(int arr[], int x){
    	for(int i=0; i<6; i++){
    		if(arr[i]==x)
    			return i;
    	}
    }
    
    int main(){
    	int sum, maximum, bottom, top;
    	scanf("%d", &t);
    	while(t--){
    		maximum = 0;
    		scanf("%d", &n);
    		for(int i=0; i<n; i++)
    			for(int j=0; j<6; j++)
    				scanf("%d", &dice[i][j]);
    		for(int i=0; i<6; i++){
    			sum = 0;
    			bottom = i;
    			for(int j=0; j<n; j++){
    				top = op(bottom);
    				sum += maxside(dice[j], bottom, top);
    				if(j<n-1)
    					bottom = find(dice[j+1], dice[j][top]);
    			}
    			if(sum>maximum)
    				maximum = sum;
    		}
    		printf("%d\n", maximum);
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    973
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者