A. Even Subset Sum Problem

找一个偶数,或找两个奇数
#include <bits/stdc++.h>
using namespace std;
int a[105];
int b,c;
int main(){
int t;cin>>t;
while(t--){
b=0,c=0;
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]%2==0)b=i;
if(b==0)b=i;
else if(c==0)c=i;
}
if(a[b]%2==0)cout<<1<<endl<<b<<endl;
else if(a[c]%2==1)cout<<2<<endl<<b<<' '<<c<<endl;
else cout<<-1<<endl;
}
return 0;
}
B. Count Subrectangles

找连续的1即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int c[40055];
int d[40055];
int main(){
int n,m,k;
cin>>n>>m>>k;
int x=0,q;
for(int i=1;i<=n;i++){
cin>>q;
if(q==1)x++;
if(q==0||i==n){
for(int j=1;j<=x;j++)c[j]+=x-j+1;
x=0;
}
}
for(int i=1;i<=m;i++){
cin>>q;
if(q==1)x++;
if(q==0||i==m){
for(int j=1;j<=x;j++)d[j]+=x-j+1;
x=0;
}
}
ll cnt=0;
for(int i=1;i<=40005;i++){
if(k%i==0&&k/i<=40005)cnt+=c[i]*d[k/i];
}
cout<<cnt;
}
C. Unusual Competitions

从左往右遍历,当遍历到一个右括号,且此时右括号数量大于左括号时,说明该右括号不合法,将它和它后面的左括号交换
#include <bits/stdc++.h>
using namespace std;
int n;
string s;
queue<int>q;
int main(){
cin>>n>>s;
int zuo=0;//记录左括号数量
int you=0;//记录右括号数量
int sum=0;//记录次数
for(int i=0;i<s.length();i++){
if(s[i]=='('){
zuo++;
q.push(i);//压入左括号的位置
}
else you++;
}
if(zuo!=you){//如果左括号和右括号的数量不同,则不合法
cout<<-1;
}
else{
zuo=0;
you=0;
for(int i=0;i<s.length();i++){
if(s[i]=='('){
q.pop();//合法的左括号,弹出
zuo++;//左括号数量+1
}
else if(s[i]==')'){
if(zuo<(you+1)){//如果该后括号不合法
int we=q.front();//找到它右边最近的左括号进行交换
s[i]='(';
s[we]=')';
q.pop();//弹出交换的左括号
sum+=2;
zuo++;//换完后当前是左括号,因此数量+1
}
else you++;//右括号数量+1
}
}
cout<<sum;
}
}
本文探讨了三个具体的算法问题:寻找偶数子集、计数子矩形中的连续1以及修复不平衡的括号串。通过代码示例,详细解释了如何使用C++高效地解决这些问题,为读者提供了深入理解算法设计的机会。

407

被折叠的 条评论
为什么被折叠?



