原题链接: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;
}