D. Array Division
之所以循环到n和循环到1,是因为,设某一边的数组是整个数组,这时移动一个数到空的一边,此时也是成立的。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, mod = 1e9 + 7;
int a[N], sum[N];
signed main()
{
int t;
// cin >> t;
t = 1;
while(t--) {
int n;
cin >> n;
set<int> s, s1;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
if (sum[n] & 1) {
cout << "NO" << endl;
continue;
}
bool ck = 0;
for (int i = 1; i <= n; i++) {
s.insert(a[i]);
int q = sum[i], h = sum[n] - sum[i];
if (q == h) {
ck = 1;
break;
}
else {
if (sum[n] / 2 < q) {
int x = sum[n] / 2 - q;
x *= -1;
if (s.find(x) != s.end()) {
ck = 1;
break;
}
}
}
}
for (int i = n; i >= 1; i--) {
s1.insert(a[i]);
int q = sum[n] - sum[i - 1];
if (sum[n] / 2 < q) {
int x = sum[n] / 2 - q;
x *= -1;
if (s1.find(x) != s1.end()) {
ck = 1;
break;
}
}
}
if (ck) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
幸运年份
简单的傻逼题,却wa了两发。
原因有二:
1.log函数的底数是e,log10函数的底才是10,直接用log(n)/log(10),这样子会有精度损失。
2.pow函数没有用long long强制转化,会发生浮点错误。
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N = 1e5 + 5, mod = 1e9 + 7;
signed main()
{
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
int len = log10(n);
// cout << "log = " << log10(n) << endl;
// cout << pow(10, len) << " ," << endl;
// len++;
int k = n / pow(10, len) + 1;
// cout << pow(10, len) * k - n << endl;
printf("%lld\n", (long long)pow(10, len) * k - n);
}
return 0;
}