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;
    	}
    }
    
  • 相关阅读:
    rMATs分析single-end 数据,结果文件为空?
    Error in inherits(x, "theme") : argument "e2" is missing, with no default
    R 变量名开头不能为数字
    linux 下的通配符和正则表达式不一样
    samtools的一些问题
    Error in C(1, 2) : object not interpretable as a factor
    grep -w 正确使用,结果却不正确的原因之一
    慎用rm命令和*
    定义默认字典值为列表类型
    C语言考题:Find the key in the picture,good luck..
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13812098.html
Copyright © 2011-2022 走看看