0
点赞
收藏
分享

微信扫一扫

AcWing第33-37场周赛

山竹山竹px 2022-02-17 阅读 19
算法c++

在此记录,仅为方便复盘。

-第33场周赛

4207. 最长合法括号子序列

一个合法的括号序列满足以下条件:
序列()被认为是合法的。
如果序列X与Y是合法的,则XY也被认为是合法的。
如果序列X是合法的,则(X)也是合法的。
例如,()()()(())这些都是合法的。

现在,给定一个由 () 组成的字符串。

请你求出其中的最长合法括号子序列的长度。

注意,子序列不一定连续。

输入格式

输出格式

数据范围

输入样例1:

(()))(

输出样例1:

4

输入样例2:

()()(()(((

输出样例2:

6
#include<iostream>
using namespace std;

int main(){
	char x;
	int flag=0,cnt=0,max=0;
	while(cin>>x){
		if(x=='('){
			flag++;
			cnt++;
		}
		if(x==')'&&flag>0){
			flag--;
			cnt++;
		}
		if(flag>=0)max=cnt-flag;
	}
	cout<<max;
	return 0;
}

4208. 电话号码

输入格式

输出格式

数据范围

输入样例1:

2
i 1 00123
m 1 00123

输出样例1:

2
m 1 00123 
i 1 00123 

这道题没写,之后补上

-第34场周赛

4210. 数字

输入格式

输出格式

数据范围

输入样例1:

5

输出样例1:

7/3
#include<iostream>
using namespace std;
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
int main(){
	int a,i;
	cin>>a;
	int sum=0;
	int b;
	for(i=2;i<a;i++){
		b=a;
		while(b){
		sum+=b%i; //短除法
		b/=i;	
		}
	} 
	int d=gcd(sum,a-2);
	sum/=d;
	a-=2;
	a/=d;
	cout<<sum<<"/"<<a;
	return 0;
}

4211. 序列重排

输入格式

输出格式

数据范围

输入样例1:

6
4 8 6 3 12 9

输出样例1:

9 3 6 12 4 8 
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

typedef long long ll;

int get(ll x,ll b){
	int res=0;
	while(x%b==0){
	res++;
	x/=b;
	}
	return res;
}
int main(){
	int n;
	cin>>n;
	vector<ll> t[n];
	int i;
	for(i=0;i<n;i++){
		ll x;
		cin>>x;
		t[i]={get(x,2),-get(x,3),x};
	}
	sort(t,t+n);
	for(i=0;i<n;i++){
		cout<<t[i][2]<<" "; 
	}
	return 0;
}

-第35场周赛

4213. 最小结果

输入格式

输出格式

数据范围

输入样例1:

1 1 1 1
+ + *

输出样例1:

3
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;

char op[5];
LL ans=1e18;

void dfs(vector<LL> v,int u){
	if(v.size()==1)ans=min(ans,v[0]);
	else{
		for(int i=0;i<v.size();i++){
			for(int j=i+1;j<v.size();j++){
				vector<LL> t;
				for(int k=0;k<v.size();k++){
					if(k!=i&&k!=j){
						t.push_back(v[k]);
					}
				}
					if(op[u]=='*')t.push_back(v[i]*v[j]);
					else t.push_back(v[i]+v[j]);
			dfs(t,u+1);
			}
		}
	}
}
int main(){
	vector<LL> v(4);
	int i,j;
	for(i=0;i<4;i++)cin>>v[i];
	for(i=0;i<3;i++)cin>>op[i];
	dfs(v,0);
	cout<<ans<<endl;
	return 0;
}

4214. 三元组

输出格式

数据范围

输入样例1:

5
2 4 5 4 10
40 30 20 10 40

输出样例1:

90
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int s[3001],c[3001];
const int INF=5e8;
int main(){
	int n;
	cin>>n;
	int i;
	int res=INF;
	for(i=0;i<n;i++)cin>>s[i];
	for(i=0;i<n;i++)cin>>c[i];
	for(int j=0;j<n;j++){
		int left=INF;
		for(i=0;i<j;i++){
			if(s[i]<s[j])left=min(left,c[i]);
		}
		int right=INF;
		for(int k=j+1;k<n;k++){
			if(s[k]>s[j])right=min(right,c[k]);
		}
		res=min(res,left+c[j]+right);
	}
	if(res==INF)res=-1;
	cout<<res<<endl;
	return 0;
}

-第36场周赛
没有,之后补上

-第37场周赛

4297. 截断数组

输入格式

输出格式

数据范围

输入样例1:

5
1 3 1 1 4

输出样例1:

5
#include<iostream>
using namespace std;
int main(){
	int n;
	cin>>n;
	int a[n];
	int i;
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	long long sum1=0,sum2=0,sum=0;
	for(i=0;i<=n;){
		if(sum1==sum2){
		sum=sum1;
		sum1+=a[i];
		sum2+=a[n-1];
		i++;
		n--;
		}else if(sum1>sum2){
			sum2+=a[n-1];
			n--;
		}else if(sum1<sum2){
			sum1+=a[i];
			i++;
		}
	}
	cout<<sum;
	return 0;
}

4298. 搭档

输出格式

数据范围

输入样例1:

4
1 4 6 2
5
5 1 5 7 9

输出样例1:

3
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	int n,m,i,j;
	cin>>n;
	int a[n];
	for(i=0;i<n;i++){
		cin>>a[i];
	}
	cin>>m;
	int b[m];
	for(i=0;i<m;i++){
		cin>>b[i];
	}
	sort(a,a+n);
	sort(b,b+m);
	int ans=0;
	for(i=0,j=0;i<n;){
		if(j==m)break; 
		if(abs(a[i]-b[j])<=1){
			ans++;
			i++;
			j++;
		}else if(a[i]>b[j])j++;
		else if(a[i]<b[j])i++;
		
	}
	cout<<ans;
	return 0;
}
举报

相关推荐

[Acwing] 第 49 场周赛

Acwing 第 42 场周赛

acwing 第24场周赛

acwing第42场周赛

Acwing第 44 场周赛【完结】

AcWing第46场周赛总结

0 条评论