The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.
Input Specification:
Each input file contains one test case. For each case, the first line contains an integer N (in [3,105]), followed by N integer distances D1 D2 ⋯ DN, where Di is the distance between the i-th and the (i+1)-st exits, and DN is between the N-th and the 1st exits. All the numbers in a line are separated by a space. The second line gives a positive integer M (≤104), with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N. It is guaranteed that the total round trip distance is no more than 107.
Output Specification:
For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.
Sample Input:
5 1 2 4 14 9
3
1 3
2 5
4 1
Sample Output:
3
10
7
我的代码:(有超时)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int generateD(int left, int right,vector<int> a,int n)
{
if (right < left)
{
right += n;
}
int sum = 0;
for (int i = left; i < right; i++)
{
sum += a[i];
}
return sum;
}
int main()
{
freopen("in.txt", "r", stdin);
int n;
cin >> n;
vector<int> a(2 * n + 1);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
a[i + n] = a[i];
}
int times;
cin >> times;
for (int i = 0; i < times; i++)
{
int left, right;
cin >> left >> right;
int d1 = generateD(left, right,a,n);
swap(left, right);
int d2 = generateD(left, right,a,n);
cout << min(d1,d2) << endl;
}
fclose(stdin);
return 0;
}
结果:
柳婼的思路还是累加:
我觉得要陈越希望你在写代码的时候考虑运行时间 你能大概知道这代码是否会超时 希望你去动脑筋想运行时间短的代码。
但是我现在还不能知晓我的这个代码到底哪里费时间,这个应该属于内功。
后来想了下 大概是多了这个计算累加距离的for语句,因为left和right交换后还要累加一次 共多了两次:
自己按照柳婼的思路写的代码 细节有所不同:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int generateD(int left, int right,vector<int> a,int n)
{
return 0;
}
int main()
{
//freopen("in.txt", "r", stdin);
int n,all=0;
cin >> n;
vector<int> sum(n+1,0); //保存从第一个出口到第i个出口的距离
for (int i = 2; i <= n; i++) //因为从第一个出口到第一个出口 距离是0,所以从第二个出口开始算
{
int temp;
cin >> temp;
all += temp;
sum[i] = all;
}
//上面的for里最后写到第一个出口到第五个距离 ,但是第五个出口到第一的距离还没有输入,而且在后面算二种距离的时候要用,所以这里再把最后一个值单独加上。
int temp;
cin >> temp;
all += temp;
int times;
cin >> times;
for (int i = 0; i < times; i++)
{
int left, right;
cin >> left >> right;
if (right < left)
{
swap(right, left);
}
int tempSum = sum[right] - sum[left];//总和相减得到中间的距离,因为上面给sum赋值的时候处理的比较完善 ,所以这里直接减就行了
cout << min(tempSum,all-tempSum ) << endl;
}
//fclose(stdin);
return 0;
}
悟: 简单的题,陈越会在内存和运行时间上苛刻以增加难度,这种反而很可能考验细节和内力(内力主要是指 对复杂度的理解,敏感,甚至逻辑清晰的要求)。