A. Luntik and Concerts
题意:有两个音乐会,有a+b+c首歌曲,分别是一分钟,两分钟,三分钟,问如何分配歌曲使得两个音乐会举办的时间差最小。
思路:观察样例和举例可以发现答案只能是1或者0,我们可以计算总时间如果总时间为奇数那么答案就是1,是偶数就是0。
AC code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a,b,c;
void solve(){
cin>>a>>b>>c;
ll sum=a+b*2+c*3;
if(sum&1){
cout<<1<<endl;
}else{
cout<<0<<endl;
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
B. Luntik and Subsequences
题意:给你一个数组,问你有多少个子序列满足子序列的总和等于原数组的总和-1。
思路:要使总和差1,那么一定只能去除1,此外,a[i]还有可能为0,假设1的个数为cnt1,0的个数为cnt0,那么答案就是cnt1^cnt0。
AC code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100;
int n,a[N],sum[N];
void solve(){
cin>>n;
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0){
cnt1++;
}else if(a[i]==1){
cnt2++;
}
}
ll t1=1ll<<cnt1;
ll ans=t1*cnt2;
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
C. Grandma Capa Knits a Scarf
题意:给出一个字符串,我们需要将字符串变换成回文字符串,我们每次可以选择一个特殊字母,然后对在字符串中的某一个或者几个特殊字母删除掉,求最少的操作次数,如果不可能变成回文字符串,那么输出-1。
思路:我们可以发现,如果能够使它变成回文字符串,那么只需删除一种特殊字母就行了,没有必要删除多种字母,因此,我们可以枚举26个英文字母将它们一一check,求最小的操作次数即可。
AC code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
string s;
ll f(char x){
int l=1,r=n;
ll cnt=0;
while(l<r){
if(s[l]==s[r]){
l++;
r--;
}else if(s[l]==x){
l++;
cnt++;
}else if(s[r]==x){
r--;
cnt++;
}else{
return 1e17;
}
}
return cnt;
}
void solve(){
cin>>n>>s;
s='!'+s;
ll ans=1e15;
for(char i='a';i<='z';i++){
ans=min(ans,f(i));
}
if(ans==1e15) cout<<-1<<endl;
else cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
D. Vupsen, Pupsen and 0
题意:给你一个数组a,均不等于0,要求你构造一个数组b使得所有的a[i]*b[i]的和为0。
思路:我们可以对一段区间满足和为0,那么所有的区间加起来和也为0,当n为偶数时,将两个看成一个区间,我们可以构造相反数使得和恰好为0,例如b[i]=-a[i+1],b[i+1]=a[i],对于n/2个区间都是这样即可,当n为奇数时,我们可以将三个看成一个区间,剩余的按照偶数的那样去做就行。如何构造三个区间和为0呢,我们可以在最后三个数里面找两个和不为0的数,假设a[i]和a[i+1],那么b[i]=-a[i+2],b[i+1]=-a[i+2],b[i+2]=(a[i]+a[i+1])就可以构造出来了,详情看代码。
AC code:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int n,a[N];
vector<ll> v;
void solve(){
cin>>n;
v.clear();
for(int i=1;i<=n;i++){
cin>>a[i];
}
if(n&1){
for(int i=1;i<=n-4;i+=2){
v.push_back(-a[i+1]);
v.push_back(a[i]);
}
int x=a[n-2],y=a[n-1],z=a[n];
if(x+y){
v.push_back(-z);
v.push_back(-z);
v.push_back(x+y);
}else if(x+z){
v.push_back(-y);
v.push_back(x+z);
v.push_back(-y);
}else if(y+z){
v.push_back(y+z);
v.push_back(-x);
v.push_back(-x);
}
}else{
for(int i=1;i<=n-1;i+=2){
v.push_back(-a[i+1]);
v.push_back(a[i]);
}
}
for(auto it : v){
cout<<it<<' ';
}
cout<<endl;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}