A - Luntik and Concerts
题意:
一共a个 1, b个 2, c个 3分成两组,其中 a,b,c>=1 ,使得两组的元素和之差最小。求这个最小值。
题解:
c要么为奇数要么为偶数,同时a和b都大于1,如果c为奇数的话拿出一个1一个2就可以把所有的3都平均分了,如果是偶数的话所有的3能直接平均分。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b,c;
cin>>a>>b>>c;
int num=a+b*2+c*3;
if(num%2==0)
cout<<0<<endl;
else
cout<<1<<endl;
}
}
B - Luntik and Subsequences
题意:
就是求比s少一的集合
题解:
首先找出所有的0和1,答案就是1的个数乘以2的零的个数的次方
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
long long ans=0,sum=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(x==1)
{
ans++;
}
if(x==0)
{
sum++;
}
}
long long cont=ans*pow(2,sum);
cout<<cont<<endl;
}
}
C - Grandma Capa Knits a Scarf
题意:
在字符串 s 中找一种字符 c,删去字符串中 x 个 c 得到字符串 s 1,且 s1 是回文串,求需要删去字符的个数 x 的最小值。
题解:
因为就删除一个,所以直接遍历26个字符来看看那个最小直接输出最小的那个就行了。
#include<bits/stdc++.h>
using namespace std;
int check(string s,char a)
{
int l=0,r=s.size()-1;
int conut=0;
while(l<r)
{
if(s[l]==s[r])
{
l++;
r--;
continue;
}
if(s[l]!=s[r] && s[l]==a)
{
l++;
conut++;
continue;
}
if(s[r]!=s[l] && s[r]==a)
{
r--;
conut++;
continue;
}
return 1e7;
}
return conut;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
string s;
cin>>s;
int ans=1e7;
check(s,'a');
for(char i='a';i<='z';i++)
{
ans=min(ans,check(s,i));
}
cout<<(ans==1e7?-1:ans)<<endl;
}
}
D - Vupsen, Pupsen and 0
题意:
已知某 n 项非零数列 a,找到某 n项非零数列 b,使得满足其中的两个条件就可以了a*b的和等于0
题解:
这道题要求构造一个b数组使得与对应a元素的乘积之和为0,并且要求b数组的各项绝对值之和要小于等于1e9,再结合a数组元素值的大小来看,已经暗示了只要将a数组进行相应的调整便可以。该题可以分为两种情况:
第一种:n为偶数的情况,此时两两相邻元素之间可以凑为一对,我们写为x y,那么很容易想到b数组对应的为-y x即可让这一对的sum变为0.
第二种:n为奇数的时候,这时候我们可以把前三个数单独拿出来计算,而从第四个数开始直到第n个数的做法就可以和第一种情况一样计算。
把前面三个数记为a b c,这时候我们可以将a+b看做一个整体记为A,所以此时的数为A c,b数组对应的值即为-c A,注意a+b不能为0,否则不符合题意。
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int nn;
cin>>nn;
for(int i=1;i<=nn;i++)cin>>a[i];
if(nn%2==0)//第一种情况
{
for(int i=1;i<=nn;i++)
{
if(i%2!=0)cout<<-a[i+1]<<" ";
else cout<<a[i-1]<<" ";
}
cout<<endl;
}
else
{
int m,n,l;
if(a[1]+a[2]!=0){m=a[1],n=a[2],l=a[3];cout<<-l<<" "<<-l<<" "<<m+n<<" ";}
else if(a[1]+a[3]!=0){m=a[1],n=a[3],l=a[2];cout<<-l<<" "<<m+n<<" "<<-l<<" ";}
else if(a[2]+a[3]!=0){m=a[2],n=a[3],l=a[1];cout<<m+n<<" "<<-l<<" "<<-l<<" ";}
for(int i=4;i<=nn;i++)
{
if(i%2==0)cout<<-a[i+1]<<" ";
else cout<<a[i-1]<<" ";
}
cout<<endl;
}
}
}