zoukankan      html  css  js  c++  java
  • A1046 Shortest Distance [简单模拟--卡算法复杂度]

    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,10​5​​]), followed by N integer distances D​1​​ D​2​​ ⋯ D​N​​, where D​i​​ is the distance between the i-th and the (i+1)-st exits, and D​N​​ 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 (≤10​4​​), 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 10​7​​.

    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

    ————————————————
    这个第三个测试点,考察复杂度,卡时间点,原本的复杂度太高了,达到了M*N的复杂度,采用走一步存一步的方法,这样复杂度讲到了常数1。

    #include<iostream>
    using namespace std;
    int main()
    {
    	int n, m, a[100001] = { 0 }; int sum = 0;int dis[100001];
    	cin >> n;
    	for (int i = 1; i <= n; i++)
    	{
    		cin >> a[i];
            sum += a[i];
            dis[i]=sum;
    	}
    	cin >> m; int c, d; 
    	for (int i = 0; i < m; i++)
    	{
    		int temp1 = 0;
    		cin >> c >> d;
    		if (c > d)
    		{
    			int temp = c;
    			c = d;
    			d = temp;
    		}
            temp1=dis[d-1]-dis[c-1];
    		int temp = sum - temp1;
    		if (temp <= temp1)
    			cout << temp << endl;
    		else
    			cout << temp1<< endl;
    	}
    }
    

    这个是原本的

    #include<iostream>
    using namespace std;
    int main()
    {
    	int n, m, a[11110] = { 0 }; int sum = 0;
    	cin >> n;
    	for (int i = 1; i <= n; i++)
    	{
    		cin >> a[i];
            sum += a[i];
    	}
    	cin >> m; int c, d; 
    	for (int i = 0; i < m; i++)
    	{
    		int dis = 0;
    		cin >> c >> d;
    		if (c > d)
    		{
    			int temp = c;
    			c = d;
    			d = temp;
    		}
    		for (int i = c; i < d; i++)
    		{
    			dis += a[i];
    		}
    		int temp = sum - dis;
    		if (temp <= dis)
    			cout << temp << endl;
    		else
    			cout << dis << endl;
    	}
    }
    
  • 相关阅读:
    其它运算符
    位运算符
    赋值运算符
    逻辑运算符
    关系运算符
    理解twisted中的reactor和deferred(一)
    修改 Django Administration
    celery 调用scrapy
    flower 时区设置
    Python 过滤HTML实体符号简易方法
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13812098.html
Copyright © 2011-2022 走看看