我自己写的代码
#include<cstdio>
#include<time.h>
#define MIN(a,b) ((a)<(b)?(a):(b))
int N;//出口个数
void wkk(int a,int b,int A[]) ;
int main(){
int temp,temp2,j,min,max;
printf("自己的代码:\n");
scanf("%d",&N);
int distance[N+1];//可以在函数中定义新变量
for(int i=1;i<=N;i++){
scanf("%d",&temp);
distance[i]=temp;//记录距离数组
}
scanf("%d",&j);//接下来要输入j个case
int B[2*j+1];
for(int i=1;i<=j;i++){//记录case
scanf("%d %d",&temp,&temp2);
B[2*i-1]=temp;
B[2*i]=temp2;
}
double start=clock();
for(int i=1;i<=j;i++){
if(B[2*i-1]<B[2*i]){
wkk(B[2*i-1],B[2*i],distance);
}else{
wkk(B[2*i],B[2*i-1],distance);
}
}
double finish=clock();
printf("\n运行时间是%lf",finish-start);
}
void wkk(int a,int b,int A[]){
int i,j,sum1,sum2,result;
sum1=0,sum2=0,result=0;
for(i=a;i<=b-1;i++){
sum1+=A[i];
}
for(j=1;j<a;j++){
sum2+=A[j];
}
for(j=b;j<=N;j++){
sum2+=A[j];
}
result=MIN(sum1,sum2);
printf("\n%d",result);
}
然后下面是标准代码
#include<cstdio>
#include<algorithm>
#include<time.h>
using namespace std;
const int MAXN=100005;
int dis[MAXN],A[MAXN];//dis数组表示1号节点按顺时针方向到达“i号结点顺时针方向的
//下一个结点”的距离,sum表示一圈的总距离,A[i]存放i号与i+1号顶点的距离
int main(){
printf("书上的代码:\n");
int sum=0,query,n,left,right;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&A[i]);
sum+=A[i];//累加sum
dis[i]=sum;//预处理dis数组
}
scanf("%d",&query);//query个查询
for(int i=0;i<query;i++){
scanf("%d%d",&left,&right);
if(left>right) swap(left,right);//left>right时交换
int temp=dis[right-1]-dis[left-1];
printf("%d\n",min(temp,sum-temp));
}
return 0;
}
我的思想显然简单的很多,就是最简单的做法,算法复杂度在O(n^2),而答案里面的算法负责读在O(n),在所给case出口多的情况下,两者相差很大
自我总结:
1,程序中间也可以定义新变量,我记得在之前好像不可以。
2,c++中 添加#include<algorithm>可以用里面的swap(a,b),min(a,b),max(a,b)等常用函数
3,函数中wkk(int a,int b,int A[])在实际传参中如果数组是distance[],那可以写成wkk(a,b,distance),因为数组名即相当于首地址
4,const和#define都是定义常亮的,建议使用const,例如const int MAX=10005;
5,这里有一个疑惑,题目要求的输出格式和答案给的格式不一样,这里?