编程任务:
对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分。
Input
输入包括多组测试数据,每组测试数据包括两行。
第1 行是正整数n,1<=n<=100,表示有n堆石子。
第2行有n个数,分别表示每堆石子的个数。
Output
对于每组输入数据,输出两行。
第1 行中的数是最小得分;第2 行中的数是最大得分。
Sample Input
4
4 4 5 9
Sample Output
43
54
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int weight(int i,int j,vector<int> v,int n)
{
int temp=0;
int k=0;
if(j<n)
{
for(k=i;k<=j;++k)
{
temp+=v[k];
}
}
else
{
for(k=i;k<n;++k)
{
temp+=v[k];
}
for(k=0;k<=j%n;++k)
{
temp+=v[k];
}
}
return temp;
}
void calculate(vector<vector<int> >& m,vector<int> v,int n,int tag)
{
int r=0,i=0;
for(r=2;r<=n;++r)//链长
for(i=0;i<n;++i)//链起点
{
int j=i+r-1;//尾
int temp=weight(i,j,v,n);//处理j>n
m[i%n][j%n]=m[(i+1)%n][j%n]+temp;//初始化m[i][j]
for(int k=i+1;k<j;k++)
{
int t=m[i%n][k%n]+m[(k+1)%n][j%n]+temp;
if(tag==1)
{
if(t<m[i%n][j%n])m[i%n][j%n]=t;
};
if(tag==0)
{
if(t>m[i%n][j%n])m[i%n][j%n]=t;
};
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int n=0;
ifstream finput;
finput.open("input.txt");
finput>>n;
vector<int> v(n+1);
int i=0;
int temp=0;
for(i=0;i<n;i++)
{
finput>>temp;
v[i]=temp;
}
finput.close();
vector<vector<int> > m(n,vector<int>(n));
int tag=1;//tag=1,为求最小,tag=0,为求最大
calculate(m,v,n,tag);
ofstream foutput;
foutput.open("output.txt");
int result_min=m[0][n-1];
for(i=1;i<n;++i)
{
if(m[i][i-1]<result_min)result_min=m[i][i-1];
}
foutput<<result_min<<endl;
tag=0;
calculate(m,v,n,tag);
int result_max=m[0][n-1];
for(i=1;i<n;++i)
{
if(m[i][i-1]>result_max)result_max=m[i][i-1];
}
foutput<<result_max;
foutput.close();
return 0;
}
已编译运行通过,望指教,谢谢
On Apr 11, 6:48 pm, 效云 李 <lixiaoyun...@gmail.com> wrote: