• 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;
    	}
    }
    
  • 相关阅读:
    圣战 [奇环, 树上差分]
    花火之声不闻于耳 [线段树]
    SP2878 KNIGHTS
    P5300 [GXOI/GZOI2019]与或和 [单调栈]
    Speike [线段树, 动态规划]
    Jerry [动态规划]
    JSON对象
    正则书写
    flex布局实践
    数组对象的深拷贝与浅拷贝
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13812098.html
Copyright © 2020-2023  润新知