A1046.Shortest Distance(20)

我自己写的代码

#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,这里有一个疑惑,题目要求的输出格式和答案给的格式不一样,这里?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值