A. Game With Sticks
题意:给出n,m,表示有n根水平的木棍,m根竖直的木棍,每次选取一个交点,取掉相应的两根木棍,直到不存在交点位置。
// > Author: Webwei
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int p=min(n,m);
if(p%2) cout<<"Akshat"<<endl;
else cout<<"Malvika"<<endl;
return 0;
}
B. Sort the Array
题意:给出一个数列,问截取哪一部分连续子列进行翻转可以使整个数列升序排列,如果有这样的字串输出yes和截取位置,没有输出no
从前往后遍历一次再从后往前遍历一次,然后直接用reverse函数反转判断即可
// > Author: Webwei
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int a[100010];
int main()
{
int n,x=1,y=1;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++) {
if(a[i]>a[i+1])
{
x=i;
break;
}
}
for(int i=n;i>=1;i--){
if(a[i]<a[i-1])
{
y=i;
break;
}
}
//cout<<x<<" "<<y<<endl;
reverse(a+x,a+y+1);
int flag=0;
for(int i=1;i<n;i++)
{
if(a[i]>a[i+1])
{
flag=1;
break;
}
}
if(flag) cout<<"no"<<endl;
else cout<<"yes"<<endl<<x<<" "<<y<<endl;
return 0;
}
C. Predict Outcome of the Game
题意:三支球队有n场比赛,错过了k场,即这k场比赛不知道输赢,只知道第一支球队和第二支球队胜局情况差d1,第二和第三差d2,问说最后有没有可能三支队伍胜局数相同。
直接暴力枚举每一种情况即可
// > Author: Webwei
#include<iostream>
#include<algorithm>
#include<stack>
#include<cmath>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
ll n, k, d1, d2;
bool check(ll x, ll y) {
if((k - d1*x - d2*y) % 3 != 0) return 0;
ll a[4];
a[1] = (k - d1*x - d2*y) / 3;
a[2] = d1*x + a[1];
a[3] = d2*y + a[1];
//printf("check %d %d %d\n", a[1], a[2], a[3]);
sort(a+1, a+1+3);
if(a[1] < 0 || a[3] > k) return 0;
ll cha = n-k;
cha -= a[3] - a[1];
cha -= a[3] - a[2];
if(cha < 0) return 0;
if(cha % 3 == 0) return 1;
else return 0;
}
int main() {
ll t;
cin >> t;
int fff = t;
while(t--) {
cin >> n >> k >> d1 >> d2;
ll flag = 0;
if(n % 3 != 0) {
puts("no");
continue;
}
flag|=check(1, 1);
flag|=check(1, -1);
flag|=check(-1, 1);
flag|=check(-1, -1);
if(flag) puts("yes");
else puts("no");
}
}
D. Count Good Substrings
题意:一个只包含a和b的字符串, 问它有几个长度为偶数和长度为奇数的“压缩回文串”串经过压缩一定满足如下形式 ……ababab……这样只要两端的字符相同则中间一定是回文的
串经过压缩一定满足如下形式 ……ababab……
这样只要两端的字符相同则中间一定是回文的
因此对于一个a它作为左端点形成的回文串个数就等于它右边的a的个数
那么长度是奇数还是偶数呢,可以这么判断:
如果a在奇数位置上和它匹配的a也在奇数位置上,那么形成的回文串就是奇数长度的,要不就是偶数长度的
b同理
因此统计一个字符的右边和它相同的字符在奇数位置和偶数位置的有几个,然后通过计算就可以得到结果
注意最后的结果大于int,使用long long
// > Author: Webwei
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
char str[100010];
int odd[2],even[2],len;
ll sumodd,sumeven;
int main()
{
cin>>str;
sumodd=0,sumeven=0;
memset(odd,0,sizeof(odd));
memset(even,0,sizeof(even));
len=strlen(str);
for(int i=0;i<len;i++)
{
int pos=str[i]-'a';
if((i+1)%2)
{
odd[pos]++;
sumodd+=odd[pos];
sumeven+=even[pos];
}
else
{
even[pos]++;
sumodd+=even[pos];
sumeven+=odd[pos];
}
}
cout<<sumeven<<" "<<sumodd<<endl;
return 0;
}