xtu oj 六边形

六边形

题目描述

一个六边形组成的"花朵"图案,编号如图所示。

其中

2∼7构成内圈,8∼19构成外圈。 你可以按顺时钟或者逆时针方向,循环移动外圈或者内圈六边形里数字,但是不能在内外圈之间移动里面的数字。

任取一个六边形和其周围围绕的六个六边形,可以构成的一个"小花"图形,我们想知道所有这样的"小花"中的数字累加和最小是多少?

输入格式

第一行输入一个整数(1≤T≤1000),表示样例的个数。以后每个样例占1行,为19个非负整数,每个数的值不超过1000,为对应编号格子中的数字。

输出格式

每行输出一个样例的结果,为一个整数。

样例输入

1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

样例输出

28

样例解释

无论怎么旋转内外圈,中央的那个子六边形的累计和都是

1+2+3+4+5+6+7=28,这个是最小的。

解题思路:无论怎样旋转,构成六边形必有最内圈a1那个数,只要考虑两种情况即可。

1.最内圈+第二圈 即a1+a2+...+a7

2、最内圈a1+第二圈连续三个最小数+第三圈连续三个最小数

两种情况比较即可得出答案

AC代码

cs 复制代码
#include<stdio.h>
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int a[22]={};
		int i,j;
		for(i=1;i<=19;i++){
			scanf("%d",&a[i]);
		}
	    int min=0;
	    //内圈 
	    for(i=1;i<=7;i++){
	    	min+=a[i];
		}
		int min1=a[2]+a[3]+a[4],min2=a[8]+a[9]+a[10];
		int sum1,sum2;
		for(i=2;i<=7;i++){
	        if(i<=5)sum1=a[i]+a[i+1]+a[i+2];
	        else if(i==6)sum1=a[6]+a[7]+a[2];
	        else sum1=a[7]+a[2]+a[3];
			if(sum1<=min1)min1=sum1;
		}
		for(i=8;i<=19;i++){
			if(i<=17)sum2=a[i]+a[i+1]+a[i+2];
	        else if(i==18)sum2=a[18]+a[19]+a[8];
	        else sum2=a[19]+a[8]+a[9];
			if(sum2<=min2)min2=sum2;
		}
		int sum=a[1]+min1+min2;
		if(sum<=min)min=sum;
		printf("%d\n",min);
	}
} 
相关推荐
v_348360876212 分钟前
Android native端 堆栈打印
android·算法
residual_fan13 分钟前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea1 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询2 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun613 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun613 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
唐青枫4 小时前
对象到底住在哪里?C#.NET 托管堆从分配、GC 到内存排查
c#·.net
302wanger4 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼4 小时前
CF——错题的集合
算法
SL_staff5 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈