Codeforces Round 899 (Div. 2)

Dashboard - Codeforces Round 899 (Div. 2) - Codeforces

A. Increasing Sequence

由于a与b不相等,但b必须算出最小故可以从最小开始(1),故如果b = a就将其值++,使其改变即可,其余由于b1 < b2 < b3...顺着赋值即可

#include
using namespace std;
const int N = 1e7 + 10; 
int b[N], a[N];
void solve()
{
	int n, cnt = 0;
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
	}
	int k = 1;
	for(int i = 1; i <= n; i ++)
	{
		if(k != a[i])
		{
			b[i] = k;
			k ++;
		}
		else
		{
			k ++;
			b[i] = k;
			k ++;
		}
	}
	cout << b[n] << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

B. Sets and Union

对于每一个集合,我们可以先将这些集合中的数都存放在v[i]这个数组里,每一个i代表了一个集合,再将集合中有哪些数存在set中,因为set自动排序去重,我们可以不重的在set中看到每个数的存储,我们要找到几个集合的交集使其有最大的元素,最好的方案就是在所有元素中去掉一个元素,我们可以枚举每一个元素,看它在每个集合中是否出现,将没有出现过这个元素的集合全部相加,每找一个元素就比较一个元素,找到最大的缺少这个元素的集合的数为答案(将没有这个数的集合的元素存入set(ss),set(ss)会自动去重),最大值即为答案

#include
using namespace std;
void solve()
{
	int n, ans = 0;
	int s, len;
	vector v[100];
	vector v1;
	cin >> n;
	for(int i = 0; i < n; i ++)
	{
		cin >> len;
		for(int j = 0; j < len; j ++)
		{
			cin >> s;
			v[i].push_back(s);
		}
	}
	setst;
	for(int i = 0; i < n; i ++)
	{
		for(auto j : v[i])
		{
			st.insert(j);	
		}	
	}
	for(int i : st)
	{
		set ss;
		ss.clear();
		int x = i;
		for(int j = 0; j < n; j ++)
		{
			int flag = 1;
			for(auto k : v[j])
			{
				if(k == x)flag = 0;
			}
			if(flag)
			{
				for(auto o : v[j])
				{
					ss.insert(o);
				}
			}
		}
		ans = max(ans, (int)ss.size()); 
	}
	cout << ans << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

C. Card Game

题意:奇数位的a[i]进行删除并获得分数,偶数位的a[i]只用删除即可

eg.1 2 3 4 5

会发现奇数位可以算上自己以及后面的所有正整数

偶数位可以算上出自己之外的所有正整数

进行后缀和的维护即可

#include
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
void solve()
{
	ll n, a[N], s[N];
	memset(a, 0, sizeof a);
	memset(s, 0, sizeof s);
	cin >> n;
	for(int i = 1; i <= n; i ++)cin >> a[i];
	for(int i = n; i >= 1; i --)s[i] += max(s[i + 1], s[i + 1] + a[i]);
	ll ans = 0;
	for(int i = 1; i <= n; i ++)
	{
		if(i % 2)
		{
			ans = max(ans, a[i] + s[i + 1]);
		}
		else ans = max(ans, s[i + 1]);
	}
	cout << ans << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

你可能感兴趣的:(算法)