A1046 Shortest Distance (20 分)

  1. 部分超时

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    /*
    5 1 2 4 14 9
    1
    1 3
    
    */
    int main(int argc, char** argv) {
          
          
    	int n, a[100001];
    	int m;
    	int sum = 0, max = 0;
    	cin >> n;
    	for(int i = 0; i < n; i++){
          
          
    		sum += a[i];
    	}
    	
    	int begin, end;
    	
    	cin >> m;
    	while(m--){
          
          
    		cin >> begin >> end;
    		if(begin < end){
          
          
    			for(int i = begin - 1; i < end - 1; i++){
          
          
    				max += a[i];
    			}
    		} else {
          
          
    			for(int i = end - 1; i < begin - 1; i++){
          
          
    				max += a[i];
    			}
    		}
    		if(sum - max < max){
          
          
    			max = sum - max;
    		}
    		cout << max << endl;
    		max = 0;
    	}
    	
    	return 0;
    }
    
    1. 满分代码

      思路:

      • 设置一个dis[]数组,以及sum变量。
      • dis[i]表示1号结点按顺时针方向到达“i”号结点顺时针的下一个结点,
      • 一定要预处理dis[] 和 sum。

      代码:

      #include <iostream>
      #include <algorithm>
      using namespace std;
      
      const int MAXN = 100005;
      int dis[MAXN], A[MAXN];
      int main(int argc, char** argv) {
              
              
      	
      	int sum = 0, query, n, left, right;
      	
      	cin >> n;
      	
      	for(int i = 1; i <= n; i++){
              
              
      		cin >> A[i];
      		sum += A[i];
      		dis[i] = sum; //预处理dis数组   dis[i]表示1号结点按顺时针方向到达"i"号结点的距离 
      	}
      	
      	cin >> query;
      	
      	while(query--){
              
              
      		cin >> left >> right;
      		if(left > right) swap(left, right);
      		int temp = dis[right-1] - dis[left-1];
      		cout << min(temp, sum - temp) << end;
      	} 
          return 0;
      }
      

猜你喜欢

转载自blog.csdn.net/alovelypeach/article/details/113785478