Bài JNEXT - Just Next trên SPOJ

JNEXT - Just Next !!!

Đây là một bài trên Spoj mà em đang mắc kẹt. Cái khó là Spoj không cho biết test cas nào sai. Đây là code của em:

int num, n;

cin >> num;
bool possible;

for (int i = 0; i < num; i++)
{
	cin >> n;
	vector<int> v(n);

	for (int j = 0; j < n; j++) cin >> v[j];
	possible = false;

	for (int j = n - 2; j >= 0; j--)
	{
		if (v[j] < v[j + 1])
		{
			possible = true;
			swap(v[j], v[j + 1]);
			sort(v.begin() + j + 1, v.end());

			for (int k = 0; k < n; k++) cout << v[k];
			break;
		}
	}

	if (possible) cout << endl;
	else cout << "-1" << endl;
}

Input:
2
5
1 5 4 8 3
10
1 4 7 4 5 8 4 1 2 6
Output:
15834
1474584162

Ý tưởng của em là chạy từ cuối chuỗi chữ số về theo thứ tự tăng dần cho tới khi gặp 1 số phá quy luật tăng dần. Sau đó, em swap số đó với số sau nó(j + 1) và sắp xếp chữ số từ j + 1 đến n. Cuối cùng in ra.

Test case mẫu của bài thì thuật toán vẫn chạy ok. Không hiểu sai ở đâu mong các cao nhân chỉ giáo ạ :smiley:

1 Like

Nếu dãy giảm dần thì sao bạn? Bạn đã thử trường hợp này chưa?

4 Likes

Hmm. Em sort có một lần mà nhỉ? Thuật toán vẫn chạy trong O(nlgn) chứ anh?

Giả sử n = 5, v = {5, 4, 1, 3, 2} thì đâu có đúng đâu nhỉ :kissing: next permutation là {5, 4, 2, 1, 3} chứ ha.

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