题目描述如下:
核心:模拟+比较
//核心:模拟
#include<stdio.h>
#include<string.h>
int huan[10005];
int min(int a,int b) //最小值查找程序
{
return a<=b?a:b;
}
void change()
{
memset(huan,0,sizeof(huan)); //数组初始化程序
}
void sol()
{
change();
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&huan[i]); //从1开始输入环的数据
}
//调试 for(int i=1;i<=n;i++) printf("%d\n",huan[i]);
//模拟假设某段最长恰好没有走过
int ans=0;
for(int i=1;i<=n;i++) //从第1段开始假设至第n段模拟假设 断开的节点为i
{
if(i==1){
for(int j=n;j>=2;j--){
ans+=huan[j]; //相当于从最后一段走到第二段
}
}
else{
int p=0,q=0;
for(int j=1;j<i;j++){
p+=huan[j];
}
p*=2;
for(int j=n;j>i;j--){
p+=huan[j];
}
//得到顺时针在第i段折反的情况
for(int k=n;k>i;k--){
q+=huan[k];
}
q*=2;
for(int k=1;k<i;k++){
q+=huan[k];
}
ans=min(ans,p);
ans=min(ans,q);
}
}
printf("%d\n",ans);
}
int main()
{
int o;scanf("%d",&o);
while(o--){
sol();
}
return 0;
}
//test结果已经正确
跑不了online judge,我也不知道我这哪里可能会出现错误
但原理应该没错,毕竟举的实例如下