Untitled

 avatar
unknown
plain_text
2 years ago
1.7 kB
2
Indexable
Array game:
Có 1 trò chơi với dãy gồm N số như sau:
Mỗi bước đi bạn phải chia mảng thành 2 phần không rỗng sao cho tổng các phần tử bên trái bằng tổng phần tử bên phải. Nếu chia được bạn sẽ được 1 điểm, nếu không chia được trò chơi kết thúc.
Sau mỗi lần chia thành công, bạn phải bỏ 1 trong 2 phần đã chia và tiếp tục trò chơi với phần còn lại.
Cho 1 dãy, hỏi số điểm nhiều nhất mà bạn có thể thu được là bao nhiêu?

Input:
Dòng đầu tiên là số lượng test case T (T <= 20).
Dòng đầu tiên của mỗi test case là N (N <= 20,000) là số lượng phần tử của dãy. Dòng tiếp theo là N phần tử của dãy đó.
Output:
Mỗi test case in ra số điểm nhiều nhất mà có thể thu được

******************************* 
Input:
3
3
3 3 3
4
2 2 2 2
7
4 1 0 1 1 0 1
Output:
0
2
3
*******************************
#include <iostream>
using namespace std;

int N; 
int a[20000];
long long sum;
int ans;
int dem;

void Try(int start, int end, long long t){
	if(t % 2 == 1) return;

	t /= 2;
	long long s = 0;
	for(int i = start; i < end; i++){
		s += a[i];
		if(s > t) return;
		if(s == t){
			dem++;
			if(dem>ans) ans = dem;
			Try(start, i + 1, t);
			Try(i + 1, end, t);
			dem--;
            break;
		}
	}

}

int main(){
	freopen("input.txt", "r", stdin);
	int T; cin >> T;

	for(int tc = 1; tc <= T; tc++){
		cin >> N;

		for(int i = 0; i < N; i++) a[i] = 0;

		sum = 0;
		ans = 0;
		dem = 0;
		for(int i = 0; i < N; i++) {
			cin >> a[i];
			sum += a[i];
		}

		if(sum == 0) ans = N - 1;
		else Try(0, N, sum);

		cout << ans << endl;
	}

	return 0;
}
Editor is loading...