蓝桥杯B组C++ D合并数列
作者:
每天吃不饱
,
2023-06-10 13:41:55
,
所有人可见
,
阅读 365
#include <bits/stdc++.h>
using i64 = long long;
i64 merge(std::vector<i64> &arr) {
i64 count = 0;
i64 n = arr.size();
for (i64 i = 0; i < n - 1; i++) {
arr[i + 1] += arr[i];
count++;
}
return count;
}
void solve() {
i64 n, m;
std::cin >> n >> m;
std::vector<i64> arr1(n);
std::vector<i64> arr2(m);
for (i64 i = 0; i < n; i++) {
std::cin >> arr1[i];
}
for (i64 i = 0; i < m; i++) {
std::cin >> arr2[i];
}
i64 count1 = merge(arr1);
i64 count2 = merge(arr2);
if (arr1 == arr2 && n == m) {
std::cout << count1 + count2 << std::endl;
} else {
std::cout << -1 << std::endl;
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
solve();
return 0;
}
#include<bits/stdc++.h> using namespace std ; const int N = 1e5+10; typedef long long ll; int a[N],b[N],n,m; int main(){ scanf("%d%d",&n,&m); for(int i =1 ;i <= n ;i ++) scanf("%d",&a[i]); for(int i = 1 ;i <= m ;i ++) scanf("%d",&b[i]); ll ans = 0; for(int i = 1 ,j = 1 ; i <= n && j <= m ;i ++ ,j ++){ if(a[i] == b[j]) continue; ll temp1 = (ll)a[i],temp2 = (ll)b[j]; int k1 = i ,k2 = j ; while(k1 <= n && k2 <= m ){ if(temp1 < temp2) temp1 += (ll)a[++k1]; else if(temp1 > temp2) temp2 += (ll)b[++k2]; else break; } ans += (ll)k1 - i + k2 - j; i = k1 ,j = k2 ; } cout << ans <<endl; return 0; }
自己随便写了一个
给个样例:
4 4
1 1 2 2
2 1 1 2
雀氏会卡,我赛时写的贪心可以过,一会放上来