Untitled
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...