對於乙個陣列,找出這樣乙個序列對(i, j),滿足a[i] < a[j],且使 j - i的值最大,輸出j - i的值。
這道題最初想到的是o(n^2)的解答,後來想到了用mergesort時來記錄最大序列對的方法,也可以用乙個佇列來做。總之解法還挺多。
最後和何海濤的這題非常相似。
方法1:mergesort,陣列的元素需要記錄原始的元素索引。
1 #include 2using
namespace
std;34
struct
node5;
9 node b[1000
];10
11int mergesort(node a, int left, int
right)
1245
46while(i <=mid)
4757
58while(j <=right)
5969
70return
res;71}
7273
intmain()74;
7677
int asize = sizeof(a) / sizeof(int
);78
79 node *c = new
node[asize];
8081
for(int i = 0; i < asize; i++)
8286
87 cout << mergesort(c, 0, asize - 1) <88 }
方法2:用乙個佇列儲存遞減序列,從陣列的第乙個數開始,不斷放入,當當前數小於佇列的尾元素則放入。這樣就構成了乙個遞減序列。當有新元素時查詢佇列中第乙個小於新元素的數,然後就能得出乙個j-i的值,如此就能得出解。由於佇列有序,所以用二分查詢的變形o(logn)。最後總的複雜度o(nlogn)
1 #include 2 #include 3using
namespace
std;45
struct
node
610 node(int idx, int
v):index(idx), val(v){}
11};
1213
int findindex(vector&a, int left, int right, int
key)
1425
else
2629}30
31int solve(int a, int
asize)
3251
52return
res;53}
5455
intmain()56;
58int asize = sizeof(a) / sizeof(int
);59 cout << solve(a, asize) <6061
int b = ;
62int bsize = sizeof(b) / sizeof(int
);63 cout << solve(b, bsize) <6465
int c = ;
66int csize = sizeof(c) / sizeof(int
);67 cout << solve(c, csize) <68 }
最大序列和
輸入描述 第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸出描述 輸入可能包括多組資料,對於每一組輸入資料,僅輸出乙個數,表示最大序列和。輸入例子 5 1 5 3 2 4 61 2 3 4 10 6 4 3 1 2 5輸出例子 9 7 1 include using namespace s...
最大序列和
給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的 序列和 對於s的所有非空連續子串行t,求最大的序列和。變數條件 n為正整數,n 1000000,結果序列和在範圍 2 63,2 63 1 以內。第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸入可能包括多組資...
最大序列和
給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的 序列和 對於s的所有非空連續子串行t,求最大的序列和。變數條件 n為正整數,n 1000000,結果序列和在範圍 2 63,2 63 1 以內。第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸入可能包括多組資...