Codeforces Round #613 (Div. 2)

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