六边形
题目描述
一个六边形组成的"花朵"图案,编号如图所示。
其中
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,这个是最小的。
解题思路:无论怎样旋转,构成六边形必有最内圈a[1]那个数,只要考虑两种情况即可。
1.最内圈+第二圈 即a[1]+a[2]+...+a[7]
2、最内圈a[1]+第二圈连续三个最小数+第三圈连续三个最小数
两种情况比较即可得出答案
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);
}
}