问题 E: Shortest Distance (20)
问题 E: Shortest Distance (20)
时间限制: 1 Sec 内存限制: 32 MB献花: 181 解决: 83
[献花][花圈][TK题库]
题目描述
输入
输出
样例输入
5 1 2 4 14 9
3
1 3
2 5
4 1
样例输出
3
10
7
参考代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
int n, m;
int temp;
int start, end;
int distance=0;
int a[10000]={};
// int b[100]={0};
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d",&temp);
distance+=temp;
a[i+1]=a[i]+temp;
}
// printf("%d\n", distance);
scanf("%d", &m);
for(int i=0;i<m;i++){
int distance1=0;
scanf("%d %d",&start,&end);
distance1=abs(a[start]-a[end]);
printf("%d",min(distance1,distance-distance1));
// for(int j=min(start, end);j<max(start, end);j++){
// distance1+=a[j-1];
// if(distance1<distance-distance1){
// b[i]=distance1;
// }else{
// b[i]=distance-distance1;
}
// for(int i=0;i<m;i++){
// printf("%d\n", b[i]);
// }
return 0;
}
输入n代表后面输入n个数,这些数不需要用数组保存,只要用普通变量temp保存,立马做运算处理即可,distance变量保存总距离,表示每输入的一个数与第一点的距离的结果需要用数组a[10000]保存,m代表即将输入的组数,每一组的两个数表示起点和终点,它们中间的距离等于起点到第一点的距离减去终点到第一点的距离的绝对值,最后输出printf("%d",min(distance1,distance-distance1))
这题尤其要注意时间限制,注释的部分代码使用了多次for循环,导致时间超时,问题就在于没有在输入的时候就存储从1开始到各点之间的距离值,导致后来还要用for循环计算temp。如果顶点数n值很大的话,似乎确实很耗时。
使用min()函数,需要有头文件#include<algorithm>和using namespace std;