Untitled
unknown
plain_text
3 years ago
1.7 kB
6
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...