2026/1/9 11:08:51
网站建设
项目流程
德阳移动网站建设,wordpress 农场模板,网络服务机构的域名,深圳龙华网站开发对称合并内存限制: 256 Mb时间限制: 1000 ms题目描述数列 α1,α2,…,αnα1,α2,…,αn 的逆转定义为 αn,αn−1,…,α1αn,αn−1,…,α1。如果一个数列与它的逆转完全一样#xff0c;则称该数列对称。例如 1,2,2,11,2,2,1 以及 123,456,123123,456,123 都是对…对称合并内存限制: 256 Mb时间限制: 1000 ms题目描述数列 α1,α2,…,αnα1,α2,…,αn 的逆转定义为 αn,αn−1,…,α1αn,αn−1,…,α1。如果一个数列与它的逆转完全一样则称该数列对称。例如 1,2,2,11,2,2,1 以及 123,456,123123,456,123 都是对称的但 121,212121,212 不是。给定一个数列 A1,A2,…,ANA1,A2,…,AN请问至少需要进行几次合并操作才能将这个数列变成对称所谓合并操作就是在数列中选择两个相邻的数字删除它们然后将它们的和插入到删除的位置。输入格式第一行单个整数表示 NN第二行NN 个整数表示 A1,A2,…,ANA1,A2,…,AN输出格式单个整数表示答案。数据范围对于 30%30% 的数据N≤10N≤10。对于 60%60% 的数据N≤103N≤103。对于 100%100% 的数据1≤N≤1061≤N≤1061≤Ai≤1091≤Ai≤109。题解用两个指针i1, jN分别从两端开始比较A[i]和A[j]如果相等i, j--继续比较下一对如果不相等我们需要合并使得它们相等如果A[i] A[j]合并左边的A[i]和A[i1]使左边和增大如果A[i] A[j]合并右边的A[j-1]和A[j]使右边和增大每次合并操作计数加1直到i j#include iostream #include vector using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N; cin N; vectorlong long A(N); for (int i 0; i N; i) { cin A[i]; } int i 0, j N - 1; long long left_sum 0, right_sum 0; int operations 0; while (i j) { if (left_sum 0) left_sum A[i]; if (right_sum 0) right_sum A[j]; if (left_sum right_sum) { left_sum 0; right_sum 0; i; j--; } else if (left_sum right_sum) { operations; left_sum A[i 1]; i; } else { // left_sum right_sum operations; right_sum A[j - 1]; j--; } } cout operations endl; return 0; }