A. Mezo Playing Zoma
分析:
水题,直接输出长度+1
代码:
n = int(input())
s = input()
print(n + 1)
B. Just Eat It!
分析:
一开始当成求max sum做了,看了题解知道不用这么麻烦。假设有一段区间的值大于整个区间的和,那么其某一边的和一定是负的。直接从两边扫,求和判断是否为负数即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> v;
bool solve()
{
int n; cin >> n;
v.resize(n);
for (auto& i : v) cin >> i;
ll sum = 0;
for (int i = 0; i < n; i++)
{
sum += v[i];
if (sum <= 0)return false;
}
sum = 0;
for (int i = n - 1; i >= 0; i--)
{
sum += v[i];
if (sum <= 0)
return false;
}
}
int main()
{
int t; cin >> t;
while (t--)
cout << (solve() ? "YES" : "NO") << endl;
}
C. Fadi and LCM
题意:
给你一个x,x = lcm(a, b), 要求max(a, b)尽可能小。输出a, b。
分析:
首先a, b互质。因为如果a, b有公共因子,那么a和b较大的那个完全可以去掉这个因子,max(a, b)可变小。其次,枚举a只需要1->sqrt(x);
代码:
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b)
{
return !b ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b)
{
return a / gcd(a, b) * b;
}
int main()
{
ll x; cin >> x;
ll a;
for (ll i = 1; i <= sqrt(x); i++)
if (x % i == 0 && gcd(i, x / i) == 1)
a = i;
cout << a << " " << x / a << endl;
}
D. Dr. Evil Underscores
分析:
本题需要用到递归。我们现根据首位,将其分为两堆。
代码:
#include <bits/stdc++.h>
using namespace std;
vector<int> vec;
int solve(vector<int>& a, int bit)
{
if (bit == 0) return 0;
vector<int> l, r;
for (auto& it : a)
if ((it >> (bit - 1)) & 1) l.push_back(it);
else r.push_back(it);
if (l.size() == 0)
return solve(r, bit - 1);
if (r.size() == 0)
return solve(l, bit - 1);
return min(solve(l, bit - 1), solve(r, bit - 1)) + (1 << (bit - 1));
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n; cin >> n;
vec.resize(n);
for (auto& it : vec) cin >> it;
cout << solve(vec, 30) << endl;
}
E. Delete a Segment
题意:
给你n个线段(可能有交集),删掉哪一根,显现出的线段数最多是多少。
分析:
偏思维,借用别人博客了https://www.cnblogs.com/AaronChang/p/12192295.html