北理2019夏令营机考
机试(两个小时两道题):
题目1
给一个字符串,其中包括(、)、和*三种类型的字符,其中星号可以当成小括号,也可以当成大括号。问这个字符串是否是满足正常的括号匹配,若满足,输出true,不满足,输出false。
#include<iostream>
#include<cstring>
using namespace std;
string str;
bool flag;
void dfs(int pos,int cnt){
if(flag||cnt<0)return;//剪枝
if(pos>=str.length()){//出口
if(cnt==0)flag=true;
return;
}
if(str[pos]=='('){
dfs(pos+1,cnt+1);
}else if(str[pos]==')'){
dfs(pos+1,cnt-1);
}else{
dfs(pos+1,cnt+1);
dfs(pos+1,cnt-1);
}
}
int main(){
cin>>str;
dfs(0,0);
if(flag)cout<<"Accept"<<endl;
else cout<<"Wrong"<<endl;
return 0;
}
题目2
给一个整数数组,输出最大连续子数组之和。
输入:
8
3 -5 1 4 -1 2 -6 5
输出:
6
#include<iostream>
using namespace std;
const int N = 10010;
const int INF =1e9;
int a[N];
int ans;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
ans=-INF;
bool neg=true;
for(int i=0;i<n;i++){
ans=max(ans,a[i]);
if(a[i]>0){
neg=false;
break;
}
}
if(neg){//如果数组全为负数,输出最大的负数
cout<<ans<<endl;
}else{//否则每次sum小于0则重置
ans=0;
int sum=0;
for(int i=0;i<n;i++){
sum+=a[i];
if(sum<0)sum=0;
ans=max(sum,ans);
}
cout<<ans<<endl;
}
}