10.27 训练
作者:互联网
A - Luntik and Concerts
题意:
一个人要举办两场音乐会,他现在有a个一分钟歌曲,b个两分钟歌曲,c个三分钟歌曲(a,b,c>=1)
现在需要你规划这两场,使这两场音乐会的演唱差值最小,并输出这个最小差值。
思路:
先求演唱时间和,若是偶数则划分两场时间相等,奇数则有一场多一分钟。
代码:
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
long long a,b,c,sum=0;
cin>>a>>b>>c;
sum=a+b*2+c*3;
if(sum%2==0)
cout<<0<<endl;
else
cout<<1<<endl;
}
}
B - Luntik and Subsequences
题意:
给一个整数n,之后n个数,你可以当作删去任意个数个元素后得到子数组,问子数组里和等于原数组和-1的子数组个数有多少。
思路:
统计1的个数和0的个数,有一个零就有2种方案,所以不是简单的将2相加,而是求2的幂
即选择一个 1 和任意个 0 舍去,设 1 有 cnt1 个, 0 有 cnt2 个,则答案是 cnt1*pow(2,cnt0)
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int a[100]={0};
long long n,cnt0=0,cnt1=0;
long long ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]==0)
cnt0+=1;
if(a[i]==1)
cnt1+=1;
}
ans=cnt1*pow(2,cnt0);
cout<<ans<<endl;
}
}
C - Grandma Capa Knits a Scarf
题意:
给你一个字符串让你经过一些操作后,判断是否是回文串,你只能删除一种相同的字符,如果删除后是回文串,输出删除字符串的个数,若不是,输出-1。
思路:
由于我们只能选择一种字符,所以我们枚举所有的26个小写字母,然后用双指针,一个指开头,一个指结尾,两个字符相等就双指针都移动,如果不相等,看当前指向的字符是不是可以删掉,即等于当前所遍历的字符ch,如果相等则说明可以删掉当前字母,删掉字母的数量cnt++,否则说明当前遍历的字母不能构成回文,因为前后两个对称的字母又不相等,又没法删掉一个字母,所以接着遍历下一个字母,每次取最小值即可。
代码:
#include <iostream>
using namespace std;
int a[100005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
string s;
cin>>n>>s;
int res=1e9;
for (int ch=0; ch<26; ch++)
{
int l=0,r=n-1,cnt=0;
while(l<=r)
{
if(s[l]==s[r])
l++,r--;
else if(s[l] == char(ch + 'a'))
l++,cnt++;
else if(s[r] == char(ch + 'a'))
r--,cnt++;
else
{
cnt=1e9;
break;
}
}
res=min(res,cnt);
}
if(res==1e9)
res=-1;
cout<<res<<endl;
}
return 0;
}
D - Vupsen, Pupsen and 0
题意:
给你n个数为a数组,让你求一个b数组使得a,b数组对应位置相乘后的和为0
思路:
最开始想的暴力,毫无意外直接t掉,换种思路,比如1,2,3,4。我们使其两两一组,然后发现1*2+2(-1)=0,3*4+4*(-3)=0。没有错,规律题,分成数组内元素个数奇偶来判断,偶数的话如上述例子不断输出a[i] 和 - a[i+1] 即可。奇数的话,因为会多一个,所以我们处理掉前三个使其和为0,那么剩下的按照偶数的处理即可,后面的按照偶数的处理和为0,所以前三个处理完也是0(题目表明,必定有解),那么三个数,将两个数求和为一个数,在于另一个数按照偶数个元素方式解决即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n,t;
int a[N],b[N];
int main(){
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int cnt=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
if(n%2==1)
{
if(a[0]+a[1])
cout<<-a[2]<<" "<<-a[2]<<" "<<a[0]+a[1]<<" ";
else if(a[1]+a[2])
cout<<a[1]+a[2]<<" "<<-a[0]<<" "<<-a[0]<<" ";
else
cout<<-a[1]<<" "<<a[0]+a[2]<<" "<<-a[1]<<" ";
cnt=3;
}
for(int i=cnt;i<n-1;i+=2)
{
cout<<a[i+1]<<" "<<-a[i]<<" ";
}
cout<<endl;
}
return 0;
}
标签:训练,10.27,int,个数,cin,long,数组,include 来源: https://blog.csdn.net/m0_46596968/article/details/121000945