Bài tập c++ về order statistics

Dưới là code của em.
Em đang k biết cách nào để đưa ra trường hợp -1. Và cho em hỏi là cách của em có ra được với bộ test 1<=n<=10^51<=a[i]<=10^5 không ạ? Anh chị giúp em với ạ. Em cám ơn.

#include<iostream>
using namespace std;
int main() {
	int t;
	cin>>t;
	while(t--) {
		int n,*a;
		cin>>n;
		a=new int[n+1];
		for(int i=1;i<=n;i++) {
			cin>>a[i];
		}
		int res=INT_MIN;
		for(int i=1;i<n;i++) {
			for(int j=i+1;j<=n;j++) {
				if (a[j] > a[i]) {
					int h=a[j] - a[i];
					res=max(res,h);
				}
			}
		}
		cout<<res;
	}
}
1 Like

Cách gì vậy anh.em mới học còn ngơ quá.

1 Like

Đây là cách của mình O(N) cách của bạn O(N^2) thì sẽ bị quá thời gian với test case kia:

Int res=INT_MIN,Min=a[0];
for(int i=1;i<n;i++){
       res=max(res,a[i]-Min);
       Min=min(Min,a[i]);
}
if(res<=0) cout<<-1;
else cout<<res;
3 Likes

tự facepalm nhầm qua bài số bé đứng trước số lớn (khó hơn) :smiley: như trên là đúng rồi.

4 Likes

anh ơi làm cách nào để biết thời gian là O(N^2) được ạ

Quy tắc nhân có thể phát biểu: Một công việc T có độ phức tạp O(f) được thực hiện O(g) lần sẽ có độ phức tạp là O(f(n)*g(n)).

3 Likes

nếu nhìn bộ test ở bài em thì biết độ phức tạp bao nhiêu là phù hợp và có thể run được ạ

Thay số vào độ phức tạp bạn :slight_smile: nếu 10^9 thì tùy bài nhưng 10^10 thì chắc chắn là không được.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?