A. Even Subset Sum Problem
题目描述
题意:找n个数中找最少的数,是他们的和为偶数。
只有一个奇数,输出-1;
如果偶数,就输出一个偶数的下标;
如果没有偶数,就输出两个奇数的下标。
CODE:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int q;
cin>>q;
while(q--)
{
int i,n;
cin>>n;
int a[110];
int sumj=0,sume=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]&1)
sumj++;
else if(!sume)
sume=i;
}
if(sumj==1&&n==1)
{
cout<<"-1"<<endl;
continue;
}
if(sume)
{
cout<<"1"<<endl;
cout<<sume<<endl;
continue;
}
int e=2;
cout<<"2"<<endl;
for(i=1;i<=n;i++)
{
if(!e)
break;
if(a[i]&1)
{
cout<<i<<' ';
e--;
}
}
cout<<endl;
}
return 0;
}
B.Count Subrectangles
题目描述
题意:有两个数组a和b只有0和1,一个表示列,一个表示行,组成一个矩阵,对应位置是它俩的乘积。
求面积为k的全为1的矩阵有多少个。
要求出由a和b的矩阵是不现实的。
求前缀和:如果要形成一个矩形(x∗y)=k,那么要保证有在 a 数组中要有 x 个连续的1,在 b 数组中要有 y 个连续的1
OCDE:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int q;
cin>>q;
while(q--)
{
int i,n;
cin>>n;
int a[110];
int sumj=0,sume=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]&1)
sumj++;
else if(!sume)
sume=i;
}
if(sumj==1&&n==1)
{
cout<<"-1"<<endl;
continue;
}
if(sume)
{
cout<<"1"<<endl;
cout<<sume<<endl;
continue;
}
int e=2;
cout<<"2"<<endl;
for(i=1;i<=n;i++)
{
if(!e)
break;
if(a[i]&1)
{
cout<<i<<' ';
e--;
}
}
cout<<endl;
}
return 0;
}
C. Unusual Competitions
题目描述
题意:括号匹配。交换括号使得括号合法。可以进行任意次选择连续的k个字符,对他们随意排序需要花费k个精力。要使得括号匹配需要消耗最少多少体力。
左右括号数量不相等不可能匹配,输出-1.
若(加1;若)减1.
若val等于-1,说明)没有匹配,需要修改,记录这个)。
若val等于0,说明这(与前面记录的)之间的括号可以匹配。
CODE:
#include <iostream>
#include <cstring>
using namespace std;
char a[1000005];
int main()
{
int n,i,j;
int suml,sumr;
suml=sumr=0;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]=='(')
suml++;
else if(a[i]==')')
sumr++;
}
if(sumr!=suml)
{
cout<<"-1"<<endl;
return 0;
}
int ans,pos,val;
ans=pos=val=0;
for(j=1;j<=n;j++)
{
if(a[j]=='(')
{
val++;
if(val==0)
ans+=j-pos+1;
}
else{
val--;
if(val==-1)
pos=j;
}
}
cout<<ans<<endl;
return 0;
}