A - Three Piles of Candies
题目:
我们有三堆糖果,现在要将它们分为数量相等且数量尽可能多的两堆糖果。
思路:
直接将三堆糖果加在一起平分就可以了,糖果总数量无论是奇数还是偶数整除后向下取整就是我们想要的答案了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int q;
cin>>q;
while(q--)
{
long long a,b,c,ans;
cin>>a>>b>>c;
ans=(a+b+c)/2;
cout<<ans<<endl;
}
return 0;
}
B - Odd Sum Segments
题目:
给定大小为n的数组,将其分为k个子段,我们要判断可不可以使每个子段都有奇数和,如果可以请输出这k个子段的右区间。
思路:
我们要先判断可不可以使每个子段都有奇数和,因为奇数加奇数等于偶数,奇数加偶数等于奇数,所以要让每个子段都有奇数和必须要有k个以上的奇数,并且(奇数的个数-k)要是偶数才能使每个子段都有奇数和,这样我们先将k-1个奇数分别分配到一个子段里,再将剩下的所有奇数都放到最后一个字段里就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[200005],b[200005];
int main()
{
int q;
cin>>q;
while(q--)
{
int n,k,num=0,temp,cnt,x=0;
cin>>n>>k;
for(int i=0; i<n; i++)
{
cin>>a[i];
if(a[i]%2==1)
{
num++;
b[x++]=i+1;
}
}
temp=num-k;
if(num>=k&&temp%2==0)
{
cout<<"YES"<<endl;
for(int i=0;i<k-1;i++)
{
cout<<b[i]<<" ";
}
cout<<n<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
return 0;
}