Codeforces Round #832 (Div. 2)部分题解A~C

原题链接:Codeforces Round #832 (Div. 2)

题目:A. Two Groups

题意:

        将长度为n的数组a,可以把里面的元素分为俩组s1,和s2,求s1中元素的和减去s2中元素的和的绝对值的最大值,根据题意,我们可以发现,我们可以把正数放在s1,负数放在s2,最后输出

max(sum1-sum2,sum2-sum1)即可,sum1为s1中元素的和,sum2为s2中元素的和

代码:

#include<bits/stdc++.h> 
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<string.h> 
#include<map>
typedef long long ll;
using namespace std;
const int N = 1e5+10;
ll a[N],b[N];
int f[N][2];
//string s1[N],s2[N],s3[N];
int main(void)
{
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		ll sum1=0,sum2=0;
		for(int i=1;i<=n;i++)
		{
			int num;
			cin >> num;
			if(num>=0)
				sum1+=num;
			else
				sum2-=num;
		}
		cout << max(sum1-sum2,sum2-sum1) << endl;
	} 
	return 0;
 } 

题目:B. BAN BAN

题意:

        给定一个含有n个"ban"组成的字符串s,我们可以通过进行交换字符串s中的字符

使得"ban"不是s的子串,这里子串的定义是,s中通过删除字符就最终能否得到字串s1,"ban"是“banban”的字串,“ban”也是"abaabn"的字串,因为"abaabn"可以删除第1和第4和第5个字符变成“ban”。所以我们分成俩种情况

当n为奇数时,最小的操作数一定为 n/2+1;我们可以将"b"和"n"互换,这样就保证所有的"n"都在"b"的前面,使得“ban”一定不是s的子串。如n=3时,s为“banbanban”,经过操作变成"nannabbab"

当n为偶数时,最小的操作数为n/2,我们可以将“a”与“n”互换,保证所有的“a”都在“n”的后面的,这样使得“ban”一定不是s的子串,如n=4时,s为“banbanbanban”,经过操作变成“bnnbnnbaabaa”。

意思就是只要改变ban的顺序,使a或b在n的后面,或者a在b的后面这三种方法都可以做对这道题

代码:

#include<bits/stdc++.h> 
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<string.h> 
#include<map>
typedef long long ll;
using namespace std;
const int N = 1e5+10;
ll a[N],b[N];
int f[N][2];
//string s1[N],s2[N],s3[N];
int main(void)
{
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		if(n%2)
		{
			int m = n/2+1;
			cout << m << endl;
			int i=1,j=3*n;
			while(m--)
			{
				cout << i << " " << j << endl;
				i+=3;
				j-=3;
			}
		}
		else
		{
			int m = n/2;
			cout << m << endl;
			int i=2,j=3*n;
			while(m--)
			{
				cout << i << " " << j << endl;
				i+=3;
				j-=3;
			}
		}
	} 
	return 0;
 } 

题目:C. Swap Game

题意:

        Alice 和 Bob在玩一个交换游戏,将一个长度为n的数组a,让a1-1,然后再a2~an中选一个数ai与a1交换,Alice先手,以此类推,谁先让a1变成0,那就谁先赢。

规律:如果a1大于a2~an中的任意一个数,则Alice必赢,否则Bob赢,因为对于先手来说,他一定会找比a1小的那个数来进行互换,如 an为 2 1 3,Alice必定为交换第二个数变成 1 1 3,现在无论Bob怎么操作,Alice就找a2~an中最小的那个数进行操作,是稳赢的

代码

 

#include<bits/stdc++.h> 
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<string.h> 
#include<map>
typedef long long ll;
using namespace std;
const int N = 1e5+10;
ll a[N],b[N];
int f[N][2];
//string s1[N],s2[N],s3[N];
int main(void)
{
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		ll mmin=1e9+2;
		for(int i=1;i<=n;i++)
		{
			cin >> a[i];
			if(i!=1)
				mmin = min(mmin,a[i]);
		}
		if(a[1]>mmin)
			cout << "Alice" << endl;
		else
			cout << "Bob" << endl;
	} 
	return 0;
 } 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值