30/09/2018, 21:08

Hỗ trợ e bài mảng :(

đề e tóm tắt lại là nhập n số phần tử . Nếu 2 số đó trùng nau thì sẽ tăng thêm 1 đơn vị . In ra số lớn nhất
VD intput n =3
2 2 3
out => 4
nghĩa là 2 số cấp 2 trùng nhau tạo số 3 .Và số 3 đó lại tiếp tục trùng với số trong mảng nữa là 3 3 =4
VD2 3
1 2 3
out 3
Và đây là code của e sao nó chỉ chạy 1 lần là nó kiểm tra 1 lần rồi nó in ra xuất ko đúng ý e . Code này e chạy thử trùng nhau mà nó chỉ chạy 1 lần

#include<iostream>
using namespace std;
int main()
{
	int a[1000],n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			if(a[i]==a[j])
			{
				for(int k=j;k<n;k++)
				{
					a[k]=a[k+1];
				}
				n--;
				a[i]++;
			}
		}
	}
	
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<"	";
	}
		
}
Trương Quang Hiếu viết 23:11 ngày 30/09/2018

Mình chưa hiểu cách mô tả của bạn lắm.
Cho mình hỏi với test 2 1 2 2 thì kết quả ra bao nhiêu?

Trương Quang Hiếu viết 23:12 ngày 30/09/2018

Bạn để ý code của bạn nhé:
Ví dụ với test: 2 2 3
Chương trình của bạn đang chạy như thế này:

i = 0 (2) => j = 1 (2) => Vì a[i] == a[j] => a[i] = 3, a[j] = 3 (vì bạn xóa phần tử đó đi).
i = 1 (3) => j = 2 (không có giá trị. vì n của bạn còn lại = 2, và không có giá trị này).
Kết quả in ra 3

  1. Chương trình yêu cầu bạn in ra số lớn nhất trong array, chứ không phải in lại toàn bộ array.
  2. Chương trình của bạn đáng ra phải quay lại từ đầu rồi lặp lại. Nếu như thế, bạn thỏa mãn với điều kiện 2 2 3 như sau:

i = 0 (2) => j = 1 (2) => Vì a[i] == a[j] => a[i] = 3, a[j] = 3 (vì bạn xóa phần tử đó đi).
Quay lại i = 0:
i = 0 (3) => j = 1 (3) => Vì a[i] == a[j] => a[i] = 4, a[j] không có giá trị.
Kết quả in ra = 3.

Test thử 2 1 1 3

i = 0 (2) => tìm thử thì không có.
i = 1 => dãy là 2 2 3
Vòng lại từ đầu:
i = 0 (2) => dãy là 3 3
Vòng lại từ đầu:
i = 0 (3) => dãy là 4
in ra 4

Dờ Uy Duy viết 23:18 ngày 30/09/2018

2 cái trùng nhau thì nâng lên 1 bậc bài test của bạn sẽ ra 3 1 2

Dờ Uy Duy viết 23:21 ngày 30/09/2018

à @@ , tks bạn nha , h tui ms hiểu . tui làm ra rùi hihi ^^ :3

Dờ Uy Duy viết 23:14 ngày 30/09/2018

à bạn ơi coi khi test 3 3 3 3 5 sao nó ra là 5 mà ko phải 6 z
#include
using namespace std;
int main()
{
int a[1000],n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int max=a[0];
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
/for(int k=j;k<n;k++)
{
a[k]=a[k+1];
}
n–
a[i]++;
/
a[i]++;
}
}
if(a[i]>max)
{
max=a[i];
}
}

cout<<max<<"\n";
for(int i=0;i<n;i++)
{
	cout<<a[i]<<"\t";
}

}

Trương Quang Hiếu viết 23:22 ngày 30/09/2018

Mình thực sự k nhìn đc code của bạn với format như vậy.
Bạn nên làm 1 vòng while ở ngoài cùng. Khi không thể tìm thấy sự trùng lặp nữa thì in ra kết quả nhé.

Dờ Uy Duy viết 23:16 ngày 30/09/2018

mình vừa nãy ra ý tưởng là khi sau khi a[i]++ lên thì sắp xếp từ bé đến lớn để nó kt tiếp mà code mình công nhận lộn xôn thiệt @@

Dờ Uy Duy viết 23:12 ngày 30/09/2018

mình vừa nãy ra ý tưởng là khi sau khi a[i]++ lên thì sắp xếp từ bé đến lớn để nó kt tiếp mà code mình công nhận lộn xôn thiệt @@ . Nếu bạn rảnh code vòng while cho mình yk code mình chưa tối ứu và rối quá

Gió viết 23:17 ngày 30/09/2018

Thuật toán của bạn có vẻ chỉ tìm dc một cặp số bằng nhau nên chưa ra kết quả đúng.
Nhận xét của mình như sau: để tìm dc số lớn nhất, ta phải xét hết các cặp bằng nhau, và sinh ra 1 số lớn hơn trước 1 đơn vị. Điều này ngụ ý cho chúng ta là phải xét mảng theo chiều tăng dần, và cũng theo chiều xét đó phải đếm dc bao nhiêu số mới. Ta có công thức tính số cháu chắt của n số có giá trị là a như sau:

a: n
a+1: n/2
a+2: n/2/2=n/4
...
a+k: n/2^k

Nhiệm vụ tiếp theo là phải sắp xếp và đếm dãy:
giả sử mảng đã sắp sếp theo thứ tự a<b<c... và có số lượng tưong ứng là x, y,z
bây giờ tính số con sinh ra từ mẹ có giá trị a->b:

Số lượng giá trị b=y+x/2^(b-a)

Lặp lại cho đến hết mảng. Sau đó để tìm dc lớn nhất thì số cuối cùng có giá trị m và có số lượng n:
while(n!=1)n/=2,m++; sẽ tìm dc giá trị lớn nhất.

Chạy thử với mảng 3,3,3,3,5
Cặp giá trị và số lượng tương ứng là {3:4,5:1}
+từ 3->5: số lượng phần tử 5 = 1+4/2^(5-3)=2. Sau bước này dc {5:2}
+đến đây, do 5 cuối mảng, áp dụng công thức sinh đến con cuối sẽ dc phần tử lớn nhất=6

Trương Quang Hiếu viết 23:19 ngày 30/09/2018

Nếu bạn sắp xếp lại thì kết quả in dưới dạng toàn bộ mảng sẽ bị sai hết

Dờ Uy Duy viết 23:14 ngày 30/09/2018

ừa mình ko biết mình code sai chỗ nào và ý tưởng mình sai chăng

Dờ Uy Duy viết 23:13 ngày 30/09/2018

wow ý tưởng tuyệt vời <3

Bài liên quan
0